使用场景: 产品需要分析用户设备已安装的竞品 APP,所以在 APP 中以某种时机获得竞品 APP 是否已安装,并将结果上报!
使用 runtime 机制获取设备已安装 APP 信息的方式不可取
原因:
1、读取设备上应用信息需要调用系统的私有方法,苹果明令禁止
2、只有低版本或者越狱设备才能获取到
3、应用若过多,获取过程会阻塞线程
正确姿势
一、获取要判断 APP 的 scheme 地址
- 获得要分析的APP .ipa 包(推荐使用工具:爱思助手)
- 修改后缀名为 .zip , 解压 - Playload - .app文件 - 右击“显示包内容 ”
- 找到 info.plisth 文件并打开
- 找到 URL types 项,选取对应的 scheme 前缀: “demo”
- 拼接“://”为:“demo://”
二、判断 APP 是否已安装
使用 UIApplication canOpenURL 方法判断
NSURL *demoScheme = [NSURL URLWithString:@"demol://"];
BOOL isInstall = [[UIApplication sharedApplication] canOpenURL:demoScheme];
NSLog(@"demol app: %@", isInstall ? @"已安装" : @"未安装");
打印结果:
: -canOpenURL: failed for URL: "demol://" - error: "This app is not allowed to query for scheme demol"
: demol app: 未安装
三、调用 canOpenURL 失败
原因: 苹果对 UIApplication canOpenUrl 进行了保护,对第三方 app scheme 试探性的进行访问做了限制,需要将访问的 scheme 添加至白名单;
1、打开项目的 info.plist 配置文件
2、添加第三方 APP scheme 至 LSApplicationQueriesSchemes item 下
注:
1、openURL 并没有做限制,可跳转任意设备已安装应用内
2、旧版 xcode 编译运行在新 iOS 系统上,白名单只支持 50项
四、重新执行 canOpenUrl 方法
1、未安装 demo APP 执行 canOpenUrl 方法
打印结果:
demol app: 未安装
2、安装 demo APP 之后重新执行 canOpenUrl 方法
打印结果:
demol app: 已安装