uni-app app端无法直接获取已安装应用列表,需通过原生插件实现:android端调用packagemanager并申请query_all_packages权限,ios端仅支持白名单scheme探测。

uni-app App端无法直接获取已安装应用列表
uni-app 官方 API 不提供 getInstalledApps 或类似能力,uni.getSystemInfoSync() 和 uni.getBatteryInfoSync() 等均不包含应用列表字段。H5 和小程序环境更不可能支持,这是系统级权限限制,不是框架遗漏。
需要原生插件或自定义基座调用 Android/iOS 原生接口
必须通过「原生插件」方式实现:在 Android 端调用 PackageManager.getInstalledApplications()(Android 11+ 需声明 queryAllPackages 权限并配置 queries),iOS 端则根本不可行——App Store 审核策略禁止枚举其他应用,canOpenURL: 仅支持白名单检测,且需在 Info.plist 中硬编码 LSApplicationQueriesSchemes。
- Android 插件需在
AndroidManifest.xml中添加:<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"></uses-permission>
并配合<queries></queries>声明目标包名(如需过滤) - 插件 JS 层调用形如:
uni.requireNativePlugin('AppList').getInstalledApps(),返回数组含packageName、appName、versionName等字段 - iOS 插件只能做有限探测:传入一组预设 scheme(如
weixin://、alipay://),逐个调用UIApplication.shared.canOpenURL(_:)判断是否安装
真机调试必须用自定义基座,不能用官方云打包
官方标准基座未集成任何第三方原生插件,也未申请 QUERY_ALL_PACKAGES 权限。即使插件代码写对,运行时也会因权限缺失或类未注册而静默失败或抛出 java.lang.ClassNotFoundException。
- Android 端必须使用 HBuilderX 的「制作自定义基座」功能,将插件 .aar 或源码纳入编译流程
- 自定义基座需手动在
build.gradle中添加插件依赖,并确保 targetSdkVersion ≥ 30 时正确配置queries - 真机测试前务必检查
adb shell pm list packages输出,确认目标应用确实存在,避免误判插件失效
用户授权和隐私合规是绕不开的坎
Android 11(API 30)起,QUERY_ALL_PACKAGES 是特殊权限,Google Play 不允许普通应用申请;国内安卓厂商渠道包虽可配置,但上架审核会重点质询用途合理性。用户首次调用时系统弹窗文案为「允许查看所有应用?》,拒绝即返回空数组,且无二次触发入口。
- 必须在 manifest 中明确说明用途,例如:
<application android:appcomponentfactory="androidx.core.app.CoreComponentFactory"></application>
配合android:description字段 - 不能把「获取已安装应用」作为核心功能宣传,建议降级为「检测常用工具是否就绪」,只查微信、支付宝、钉钉等必要 scheme
- 返回结果不含敏感信息(如应用数据目录、进程 PID),但列表本身可能被认定为设备标识,需在隐私政策中披露
uni.openURL() 尝试跳转 + uni.onAppEnterBackground 监听回调来间接判断关键应用是否存在。真正需要完整列表的场景,几乎都指向灰产或越狱检测,这类需求本身就要重新评估合理性。











