plus.runtime.isapplicationexist是唯一稳定可用的原生级检测方式,仅在app端生效,需用#ifdef app-plus隔离并传入pname和action双参数;h5和小程序环境不支持该api,须采用降级方案。

uni-app 判断微信是否安装:只在 App 端有效
plus.runtime.isApplicationExist 是唯一稳定可用的原生级检测方式,但它**仅在 uni-app 打包为原生 App(iOS/Android)时生效**。H5 和小程序环境完全不支持该 API,强行调用会报 plus is not defined 错误。
常见错误是直接在 H5 或微信小程序里写这个判断——结果必挂。必须用条件编译隔离:
-
#ifdef APP-PLUS包裹检测逻辑,其他平台跳过 - 不要在
onLoad顶层直接执行,确保plus已就绪(可加if (typeof plus !== 'undefined')双重防护) - 安卓依赖
pname: 'com.tencent.mm',iOS 依赖action: 'weixin://',两个字段必须同时传
示例:
#ifdef APP-PLUS
if (typeof plus !== 'undefined') {
plus.runtime.isApplicationExist({
pname: 'com.tencent.mm',
action: 'weixin://'
}, function(e) {
console.log('微信已安装:', e.total === 1)
})
}
#endif
微信小程序里不能真正“检测是否安装微信”
微信小程序运行在微信自己的容器内,它天然已安装。所谓“检测微信是否安装”在小程序里是个伪命题——uni.getProvider 或 wx.getSystemInfo 返回的只是当前运行环境信息,不是设备全局状态。
如果你看到有人用 wx.getSetting 或 wx.openAppAuthorizeSetting 来“判断”,那实际只是检查用户是否授权了某项能力,和“微信是否装在手机上”完全无关。
真实场景中,小程序里需要的是:用户能否用微信支付、能否跳转到另一个小程序、能否唤起微信分享。这些都走 uni.requestPayment、uni.navigateToMiniProgram、uni.share 等 API,失败时捕获 fail 回调即可,无需前置检测。
公众号运营:文章发布至草稿、样式封面、评论与用户管理、数据统计等。用户要求将 Markdown 发送到公众号草稿、查看阅读量统计或类似后台操作时,使用本技能。
H5 环境下只能间接试探,且 iOS 13+ 基本失效
用 window.location.href = 'weixin://' 跳转 + document.hidden 检测页面是否失焦,是过去常用的试探法。但问题极多:
- iOS 13 起 Safari 默认阻止未用户手势触发的跳转,
setTimeout触发的location.href直接被忽略 - 即使跳转成功,页面也可能因后台恢复策略未及时触发
document.hidden,导致误判 - 安卓 Chrome 对 URL Scheme 的拦截越来越严,很多机型直接静默失败
- 该方法无法区分“未安装”和“安装了但拒绝跳转”
所以现在主流做法是:H5 页面直接隐藏“微信相关功能入口”,或文案改为“请在微信中打开”,不尝试检测。
容易被忽略的关键点:iOS 审核与降级方案
苹果明确禁止 App 强制要求用户安装微信才能使用核心功能(Guideline 4.2.3)。如果你在 App 中检测到微信未安装就禁用登录,上线大概率被拒。
正确做法是提供降级路径:
- 检测到微信未安装 → 显示“微信登录(需安装)”按钮 + 并行提供“手机号登录”或“网页版微信扫码登录”入口
- 扫码登录必须用
SFSafariViewController(iOS)或Chrome Custom Tabs(Android),不能用 WebView,否则仍可能被拒 - 所有微信相关能力都应有 fallback,不能让业务逻辑卡死在“等微信”这一步
最麻烦的不是怎么检测,而是检测之后怎么不把路走死。










