iOS APP应用安装情况检测

分析iOS APP应用安装检测的难点,并介绍当前我的解决方案。

2018-03-25 | 阅读

iOS 应用安装情况检测

这个需求是很常见,也是很必要的,通过分析用户的应用安装情况,很容易分析出用户的个人喜好与习惯,对于业务和风控都有极大意义。 而在iOS这个注重用户隐私的平台,要获取应用安装情况,是一个难点, 这篇文章就简单介绍一下我怎么做到的。

本文面向有一定逆向基础的开发人员,其中一些细节就不详细说明,点到为止。

检测应用安装

iOS中检测应用安装,主要通过URL Scheme (不考虑私有方法和其他不够准确的方式), 而使用URL Scheme有以下几个问题 :

  1. 如何获取某个APP的 URL Scheme : 这是难点,也是本文主要介绍的内容。
  2. URL Scheme是否准确,是否唯一 :不唯一, 且APP本身更新可能会发生变动。 所以要明确, 该种方式检测的准确性是达不到100%, 而且要经常更新以确保获取最新版本APP的URL Scheme.
  3. 是否可以无限制地查询URL Scheme : 不能, 苹果限制了 canOpenURL接口,访问的URL Scheme必须明确声明在Info.plist中,所以一个版本的APP能够检测的APP列表是固定的。 而且检测的APP也是苹果可以进行审核的, 我一般倾向认为该数量有一定限制,目前只测试过1000个APP的检测

所以,由于iOS系统的安全性和隐私保护的原因,我们只能在iOS系统上做 95%(95%只是我根据经验给出的数字)左右准确性的应用安装检测。

获取 URL Scheme

要获取一个指定应用的URL Scheme,就需要下载应用以获取应用的Info.plist文件,以解析其中的CFBundleURLSchemes 键值。获取应用列表比较简单,通过itunes的相关接口就可以遍历APP列表,以获取APP的信息,然后再做分类与统计。 所以获取URL Scheme的难点在于下载应用。

难点是批量下载iOS应用。

App Store

首先,我们考虑的应该是 App Store, App Store在下载应用时,会对用户帐号进行校验,然后发送请求去购买应用以及获取下载链接。但是这部分请求的破解,我这个逆向开发刚入门的选手,就搞不定了,所以我们没有一个完全脱离App Store 脱离iPhone的批量下载方案。

越狱平台

然后, 我们找到了另一个方向, 越狱平台,如 pp助手 。 对于该类越狱平台,他们有足够的逆向能力,应该能够逆向App Store请求以进行批量下载, 所以他们才能有如此多的应用供越狱手机下载。 而我们要从这类平台下载应用就简单多了, 该平台也没有做防爬处理,很轻松的就能从上面下载大量应用。 具体爬虫细节见代码。

但是越狱平台可能有一些应用过旧,或者没有某些应用。所以我们还需要其他方式的爬虫。然后我们又回到了App Store.

从 App Store 批量下载应用

App Store批量下载应用,有两种思路 :

  1. 逆向App Store登录、购买、下载接口细节,完全自动发请求去下载应用 。 但是上面提到了,这需要一定的逆向功底,难度比较大。
  2. 模拟操作,使用真实帐号,真实手机,在App Store上点击、下载应用。

这里介绍的就是第二种方式, 模拟操作,批量自动化下载应用。模拟操作也有两种选择 :

  1. 使用 触动精灵 , 触动精灵是一个很有意思的模拟操作框架,集成了很多工具,使用lua脚本编写, 一般用于制作游戏脚本。当然,用在这里制作批量下载应用的脚本,也是很合适的。
  2. 编写tweak, 注入到App Store ,以进行模拟点击,自动下载。

我选择了方案二, 最终编写了一个简单的tweak ,在结合其他python爬虫部分,开源在github上。

当前实现的简单说明

iOS应用爬虫运行逻辑如下图所示:

整个iOS应用爬虫分为两部分, 一是爬取越狱平台,二是模拟操作在越狱机上进行爬取。具体实现细节见github项目 , 需要有一定的python和逆向工程基础。

最后,给pp助手的一点建议

出于我爬了你们的数据的原因,我送你们一个点子。

做一个数据服务,提供iOS 应用的URL Scheme 。 要做服务,不是卖一次数据, 因为这个数据由于一定原因,不能绝对的精准,所以实时更新是必须。

提供这个数据服务,市场是很大的, 用户应用安装情况,对所有大型的应用来说,都是分析客户的极佳方式,而且用户无感知。 这个数据,当前市场上没有, 因为实现难度较大, 但是完全切合你们的技术,如果你们提供这种服务, 一年几十万的价格,绝对有很多厂商会来购买。

😄

Android应用安装检测

安卓的检测就比较简单了,直接可以当前所有安装应用的包名, 而包名与应用的对应关系,可以很轻松地通过几大应用市场进行爬取。仓库里面附带了简单的安卓爬虫。