在 UniApp 中,获取应用列表权限主要用于读取设备上已安装的应用信息(如包名、应用名称等),通常用于统计分析、应用推荐或安全检测等场景。由于 UniApp 基于跨平台框架,不同平台(如 Android、iOS)的实现方式不同,以下分平台说明:
1. Android 平台
Android 系统要求应用声明 QUERY_ALL_PACKAGES 权限(Android 11 及以上)或使用 <queries> 元素来获取应用列表。
步骤:
-
在 manifest.json 中配置权限(针对 Android):
{
"app-plus": {
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.QUERY_ALL_PACKAGES\"/>"
]
}
}
}
}
- 对于 Android 11(API 30)及以上,需添加
QUERY_ALL_PACKAGES 权限。但 Google Play 对此权限有严格限制,仅允许特定用途(如文件管理器、杀毒软件等),上架前需审核。
- 对于 Android 10 及以下,可使用
GET_PACKAGES 权限(已废弃,但低版本可能有效)。
-
使用原生插件或条件编译:
- 通过 UniApp 的条件编译调用 Android 原生代码,使用
PackageManager 获取应用列表。
- 示例代码(在
android 条件编译块中):// 仅 Android 平台执行
// #ifdef APP-PLUS
if (plus.os.name === 'Android') {
const main = plus.android.runtimeMainActivity();
const packageManager = main.getPackageManager();
const packages = packageManager.getInstalledPackages(0); // 0 表示获取基础信息
const appList = [];
for (let i = 0; i < packages.size(); i++) {
const packageInfo = packages.get(i);
const appName = packageInfo.applicationInfo.loadLabel(packageManager).toString();
const packageName = packageInfo.packageName;
appList.push({ name: appName, package: packageName });
}
console.log('应用列表:', appList);
}
// #endif
- 注意:此代码需在真机调试,且依赖
plus.android 对象(HBuilderX 标准基座可用)。
2. iOS 平台
iOS 系统严格限制获取应用列表,不允许直接读取已安装应用。唯一例外是使用 canOpenURL: 方法检测特定应用是否安装(需在 info.plist 中声明 URL schemes)。因此,UniApp 无法在 iOS 端实现获取完整应用列表。
注意事项:
- 权限限制:Google Play 对
QUERY_ALL_PACKAGES 权限审核严格,普通应用可能被拒。建议仅声明必要的 <queries> 元素(针对特定应用交互)。
- 隐私合规:收集应用列表可能涉及用户隐私,需在隐私政策中说明,并遵循 GDPR、CCPA 等法规。
- 替代方案:若仅需检测少数应用是否存在,可使用
plus.runtime.isApplicationExist(Android/iOS 均支持指定包名或 URL scheme 检测)。
总结:
- Android:通过配置权限和原生代码获取,但需注意商店审核。
- iOS:无法实现,因系统限制。
建议根据实际需求选择合适方案,并优先考虑用户隐私和平台政策。如需详细代码或插件,可参考 UniApp 官方插件市场或自定义原生模块。