不能靠“点击复制+自动打开”唤起外部app,因复制与唤起是两个独立动作;uni-app中需用plus.runtime.openurl(仅app端)或uni.openapp(跨平台)调用原生能力,并严格配置android manifest和ios plist。

不能靠“点击复制 + 自动打开”这一套组合拳来唤起外部 App。复制操作和唤起 App 是两件完全独立、互不触发的事,强行绑定只会让逻辑混乱、失败率飙升。
uni-app 中复制字符串和唤起 App 是两个隔离动作
复制只是把一段文本(比如 weixin://dl/scan)塞进系统剪贴板,它不会触发任何跳转行为;而唤起 App 必须调用原生能力(如 plus.runtime.openURL 或 uni.openApp),且依赖平台配置和目标 App 的 scheme / 包名注册状态。两者之间没有隐式关联,也不存在“复制完自动执行”的机制。
常见错误现象:
- 用户点了“复制”,以为下一步 App 就该打开,结果毫无反应
- 开发者在
copy成功回调里直接调plus.runtime.openURL,但 iOS 上因未声明LSApplicationQueriesSchemes静默失败,Android 上因目标 App 未注册对应intent-filter无响应 - 误以为复制了 scheme 字符串就能像浏览器地址栏输入一样唤起 App —— 实际上只有
location.href或原生 API 才有这个能力
plus.runtime.openURL 是唤起外部 App 的实际入口,但仅限 App-plus 环境
plus.runtime.openURL 是当前最常用、最直接的唤起方式,但它只在 uni-app 编译为「App」(即 5+ App,非 H5 或小程序)且运行于真机时有效。H5 页面中调用它会直接报错或静默忽略。
使用前提与要点:
- Android:目标 App 必须在
AndroidManifest.xml中声明含android:scheme="xxx"的<intent-filter></intent-filter>,你传的 URL 必须严格匹配,例如"weixin://dl/scan" - iOS:必须在
manifest.json的「iOS 设置」→「URLScheme」中填写weixin(不带://),且目标 App 的Info.plist已将weixin加入LSApplicationQueriesSchemes - 该 API 返回布尔值,
true仅表示“调用发起成功”,不代表 App 真的打开了;false多数是格式错误或平台拦截,不是网络或权限问题 - 别在
fail回调里写“请安装微信”——iOS 上即使没装微信,只要 scheme 声明正确,也会进success
uni.openApp 更适合跨平台判断,但 iOS 安装检测不可靠
uni.openApp 是 uni-app 封装的跨平台唤起方法,底层对 Android 用包名(package:com.tencent.mm),对 iOS 用 scheme(scheme:weixin)。它比 plus.runtime.openURL 多一层抽象,但配置要求更隐蔽。
关键细节:
- Android 可通过包名较准确判断是否安装(
fail回调 errCode: 1001 表示未安装),但 iOS 不行——只要 scheme 在白名单里,无论装没装都走success -
manifest.json中 iOS 的urlScheme字段必须是数组,且只填 scheme 前缀,例如["weixin", "alipay"],写成["weixin://"]会导致编译后 Info.plist 无效 - 真机调试前务必手动检查生成的
ios/xxx.xcworkspace项目中Info.plist是否已写入对应项,HBuilderX 不会自动同步旧版工程 - 不要指望它返回 Promise 或提供打开结果反馈——它就是个“发信号”的动作,后续交给系统
复制功能本身要分平台处理,H5 必须用 document.execCommand 兜底
uni-app 的 uni.setClipboardData 在 App 和小程序端可用,但在 H5 端部分浏览器(尤其 iOS Safari)不支持或需用户手势触发。若你在 H5 页面也想复制,得自己 fallback。
实操建议:
- 优先用
uni.setClipboardData,成功后提示“已复制”,但绝不自动唤起 - H5 环境下检测
document.queryCommandSupported('copy'),再用document.execCommand('copy')配合临时<input>元素实现 - 别把复制文案设成 scheme(如
weixin://)——普通用户看不懂,且复制后无法直接粘贴到浏览器打开(iOS Safari 会过滤非法 scheme) - 如果真要引导用户手动唤起,文案应是“请打开微信 → 扫一扫 → 粘贴此码”,并配合二维码或显式按钮调用
uni.openApp
真正容易被忽略的点是:scheme 唤起不是“写对了就能用”,而是“配对了才可能用”。Android 看 manifest,iOS 看 plist,两端配置漏一个,就全盘静默失效。别在代码里反复试错,先用 ADB 或 Safari 地址栏验证目标 App 是否可被本机识别,再回头检查 uni-app 的配置项是否落地到最终原生工程里。











