iOS 检测设备上安装的应用

使用场景: 产品需要分析用户设备已安装的竞品 APP,所以在 APP 中以某种时机获得竞品 APP 是否已安装,并将结果上报!

使用 runtime 机制获取设备已安装 APP 信息的方式不可取
原因:
1、读取设备上应用信息需要调用系统的私有方法,苹果明令禁止
2、只有低版本或者越狱设备才能获取到
3、应用若过多,获取过程会阻塞线程

正确姿势

需要预先统得知所要统计的所有竞品

一、获取要判断 APP 的 scheme 地址

  1. 获得要分析的APP .ipa 包(推荐使用工具:爱思助手)
  2. 修改后缀名为 .zip , 解压 - Playload - .app文件 - 右击“显示包内容 ”
  3. 找到 info.plisth 文件并打开
  4. 找到 URL types 项,选取对应的 scheme 前缀: “demo”
info.plist
  1. 拼接“://”为:“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 下

info.plist

注:
1、openURL 并没有做限制,可跳转任意设备已安装应用内
2、旧版 xcode 编译运行在新 iOS 系统上,白名单只支持 50项

四、重新执行 canOpenUrl 方法

1、未安装 demo APP 执行 canOpenUrl 方法
打印结果:

demol app: 未安装

2、安装 demo APP 之后重新执行 canOpenUrl 方法
打印结果:

demol app: 已安装

缺点:每次增减竞品统计都依赖发版

你可能感兴趣的:(iOS 检测设备上安装的应用)