uniapp 如何获取应用列表权限

在uniapp开发中,如何获取应用列表权限?我需要在应用中获取用户手机上已安装的应用列表,但不知道如何实现。请问是否有相关的API或插件可以实现这个功能?具体应该怎么操作?

2 回复

在uniapp中,获取应用列表权限需使用原生插件或条件编译。安卓端需在manifest.json中添加权限声明,iOS端需配置权限描述。可使用uni.requestPermission API申请权限,但具体实现需依赖原生开发或第三方插件。


在 UniApp 中,获取应用列表权限主要用于读取设备上已安装的应用信息(如包名、应用名称等),通常用于统计分析、应用推荐或安全检测等场景。由于 UniApp 基于跨平台框架,不同平台(如 Android、iOS)的实现方式不同,以下分平台说明:

1. Android 平台

Android 系统要求应用声明 QUERY_ALL_PACKAGES 权限(Android 11 及以上)或使用 <queries> 元素来获取应用列表。

步骤:

  1. 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 权限(已废弃,但低版本可能有效)。
  2. 使用原生插件或条件编译

    • 通过 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 官方插件市场或自定义原生模块。

回到顶部