uni-app App端无法获取已安装应用列表:iOS完全禁止,Android需配置queries权限并用原生插件调用PackageManager,但仅支持检测特定Scheme或Intent匹配的应用,无法枚举全部。

uni-app App端无法直接获取已安装应用列表
uni-app 官方 API 不提供 getInstalledApps 或类似接口,uni.getSystemInfoSync() 和 uni.getBatteryInfoSync() 等均不包含应用列表能力。这是明确的平台限制:iOS 完全禁止第三方 App 查询其他应用安装状态;Android 从 API 30(Android 11)起也默认隐藏非系统应用列表,需显式声明权限并适配查询范围。
Android 端需配置 queries 并使用原生插件调用
若目标仅限 Android 且最低 SDK ≥ 30,必须在 manifest.json 的“Android 设置”→“AndroidManifest.xml”节点下手动补充 声明,否则 PackageManager.getInstalledApplications() 返回空列表:
<queries><package android:name="com.example.app"></package><intent><action android:name="android.intent.action.VIEW"></action></intent></queries>
更实用的做法是用 匹配常见类别(如浏览器、微信、支付宝),而非枚举包名。然后通过 uni-app 原生插件(如 uni_modules 下的自定义 app-list 插件)调用以下 Java 逻辑:
PackageManager pm = context.getPackageManager(); List<packageinfo> packages = pm.getInstalledPackages(PackageManager.MATCH_UNINSTALLED_PACKAGES);</packageinfo>
注意:MATCH_UNINSTALLED_PACKAGES 在 Android 11+ 已废弃,应改用 getInstalledApplications() + GET_META_DATA 等标志位组合。
iOS 端无可行方案,替代思路只有 URL Scheme 检测
iOS 严格限制应用间发现,无法枚举已安装 App。唯一可尝试的是逐个调用 uni.getEnvInfo 后用 uni.openURL 测试特定 URL Scheme(如 weixin://、alipay://)是否能跳转:
- 成功回调
success表示该 App 极大概率存在(但不绝对,部分 Scheme 可被拦截或失效) - 失败回调
fail不能反推“未安装”,可能是权限拒绝、系统禁用或 Scheme 变更 - 需提前在
info.plist的LSApplicationQueriesSchemes中声明所有待检测 Scheme,否则 iOS 直接拦截
这种检测方式耗时、不可靠,且 Apple 审核可能质疑其必要性。
跨端统一处理建议:放弃“获取全部列表”,聚焦具体业务场景
真正需要“已安装应用列表”的场景极少,绝大多数实际需求是:
- 判断微信是否可用 → 检测
weixin://Scheme - 唤起支付宝支付 → 直接调用
uni.requestPayment,由 SDK 内部处理唤端逻辑 - 分享到钉钉/飞书 → 使用对应官方 JS-SDK 的
checkJSApi方法 - 跳转到系统设置页 → 用
uni.openSetting()或原生跳转 intent/URL
硬要实现“列出所有 App”不仅技术上受限,还会显著增加审核风险和维护成本。Android 的 queries 配置易遗漏、iOS 的 Scheme 检测结果模糊——这些细节一旦漏掉,功能就完全失效,而且很难调试。











