如何判断用户设备是否安装指定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间接判断:
- 先确认目标应用已配置自定义URL Scheme(比如
targetapp://); - 在自己应用的
Info.plist中添加LSApplicationQueriesSchemes数组,声明要查询的Scheme:
<key>LSApplicationQueriesSchemes</key> <array> <!-- 替换为目标应用的URL Scheme --> <string>targetapp</string> </array>
- 通过
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
相关产品推荐
相关产品推荐

