You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断用户设备是否安装指定Android/iOS原生应用并实现区分UI?

判断Android/iOS设备是否安装特定应用的实现方案

Android 端实现方法

Android的实现逻辑分版本,核心是通过包管理器查询目标应用的包名:

  • Android 10 及以下:无需额外权限,直接调用PackageManager的getPackageInfo方法,捕获异常判断是否存在:
fun isAppInstalled(packageName: String, context: Context): Boolean {
    return try {
        context.packageManager.getPackageInfo(packageName, 0)
        true
    } catch (e: PackageManager.NameNotFoundException) {
        false
    }
}
  • Android 11 及以上:系统收紧了应用查询权限,必须在AndroidManifest.xml中添加<queries>标签声明目标应用包名,否则会查询失败:
<queries>
    <!-- 替换为目标应用的包名 -->
    <package android:name="com.your.target.app" />
</queries>

添加后再用上面的getPackageInfo方法即可正常判断。如果需要查询多个应用,可以添加多个<package>标签,或者通过<intent-filter>声明要匹配的应用能力(比如支持特定Scheme的应用)。

iOS 端实现方法

iOS不允许直接查询已安装应用的包名,只能通过URL Scheme间接判断:

  1. 先确认目标应用已配置自定义URL Scheme(比如targetapp://);
  2. 在自己应用的Info.plist中添加LSApplicationQueriesSchemes数组,声明要查询的Scheme:
<key>LSApplicationQueriesSchemes</key>
<array>
    <!-- 替换为目标应用的URL Scheme -->
    <string>targetapp</string>
</array>
  1. 通过canOpenURL方法判断是否有应用能响应该Scheme:
func isAppInstalled(scheme: String) -> Bool {
    guard let url = URL(string: scheme) else { return false }
    return UIApplication.shared.canOpenURL(url)
}

注意:如果目标应用没有配置自定义URL Scheme,这种方法无法生效;另外,多个应用可能共用同一个Scheme(概率极低),此时会返回true但无法确定是目标应用。

额外提醒

  • Android 11+如果不添加<queries>声明,即使应用已安装,getPackageInfo也会抛出异常;
  • 遵守平台隐私政策,只查询必要的应用,避免过度获取设备信息;
  • iOS的canOpenURL在iOS 9及以后必须声明LSApplicationQueriesSchemes,否则会直接返回false。

内容的提问来源于stack exchange,提问作者kang kang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:45:17