uni.openApp调用前必须确保包名(Android)和Scheme(iOS)配置准确匹配,否则静默失败;Android通过package判断安装状态,iOS需在manifest.json和Info.plist中正确声明Scheme。

uni-app 调用 uni.openApp 前必须确认包名和 Scheme 是否匹配
Android 和 iOS 跳转外部 App 的底层机制完全不同,uni.openApp 只是封装,不解决配置问题。直接调用失败,90% 是因为没对齐目标 App 的注册信息。
Android 看 android.intent.action.VIEW 对应的 package(即包名),iOS 看 LSApplicationQueriesSchemes 里声明的自定义 Scheme(如 weixin://、alipay://)。两者不能混用,也不能靠猜。
- 查微信:Android 用
package:com.tencent.mm,iOS 用scheme:weixin - 查支付宝:Android 用
package:com.eg.android.AlipayGphone,iOS 用scheme:alipay - 查自家 App:Android 包名在
AndroidManifest.xml的package属性;iOS Scheme 在Info.plist的CFBundleURLSchemes数组里
在 manifest.json 中漏配 iOS Scheme 会导致 uni.openApp 静默失败
iOS 上调用未声明的 Scheme,系统会直接拦截,uni.openApp 不报错也不提示,Promise 既不 resolve 也不 reject —— 这是最容易卡住的地方。
必须手动打开 manifest.json,在「iOS 设置」→「URLScheme」里填入目标 App 的 Scheme(只写前缀,如 weixin,不带 ://)。这个字段不会自动同步到 Xcode 工程,真机调试前务必检查生成的 ios/xxx.xcworkspace 项目中 Info.plist 是否已写入对应项。
- 错误写法:
"urlScheme": ["weixin://"]→ 应去掉:// - 多个 Scheme 要全写,缺一个就无法检测到对应 App 是否安装
- HBuilderX 3.9.12+ 版本会在编译时校验格式,但旧版不会提醒
uni.openApp 的 success/fail 回调在不同平台行为不一致
Android 上,如果目标 App 未安装,fail 会触发并返回 errCode: 1001;iOS 上,只要 Scheme 声明了,无论是否安装都会进 success,只有 Scheme 未声明才进 fail。这意味着你不能依赖回调判断 App 是否存在。
更可靠的方式是:Android 用 uni.getProvider 查 app,iOS 用 uni.getEnv 判断平台后,配合原生插件或 WebView 注入 JS 检测(如尝试 location.href = 'weixin://' 并监听页面是否跳走)。
-
uni.openApp({ scheme: 'weixin://' })在 iOS 上即使微信没装,也会进success - Android 的
package方式可准确判断安装状态,但仅限同厂商签名或系统级权限 App 才能获取完整包列表 - 不要在
fail里直接弹“请安装 XX”,那可能只是 iOS 的 Scheme 没配对
自定义 App 跳转时,Android 的 intent 参数必须 URL 编码
如果你要传参(比如跳转到某个页面、带用户 ID),Android 的 intent 字符串里含中文、斜杠、问号等特殊字符,不编码就会解析失败,表现为白屏或闪退。
iOS 的 Scheme 参数相对宽松,但为了一致性,建议统一用 encodeURIComponent 处理所有参数值。注意:整个 intent 字符串不是 URI,只对参数值编码,不要对整个字符串做 encodeURI。
- 正确:
intent: 'package:com.myapp;action=android.intent.action.VIEW;S.param=' + encodeURIComponent('张三/订单#123') - 错误:
intent: encodeURI('package:com.myapp;S.param=张三/订单#123')→ 会把分号、等号也编码,导致解析失败 - intent 字符串拼错一个字母(如
action写成aciton)也不会报错,只是无效









