在 iOS 开发中经常会有统计用户数量、追踪用户行为等需求,这一类的需求在技术上首先要解决的问题是如何进行设备去重,也就是对设备进行唯一性标记。

在 iOS 设备上,官方支持用来进行用户追踪的是 IDFA 广告标识符(IDFA-identifierForIdentifier),但是使用 IDFA 必须符合苹果的相关要求,当然也有许多第三方的 SDK 可以统计用户数量,比如友盟、极光推送等等。

IDFA

使用 IDFA 来标识唯一设备的好处是不用集成其他第三方 SDK,但是 IDFA 是可以被用户手动重置的,也就是说使用 IDFA 来判断独立设备是有隐患的,一旦用户将 IDFA 重置,这台设备就相当于全新的设备,会造成数据统计不精确,因此 IDFA 只能作为一个参考方案。

如果在应用中使用了 IDFA,需要符合苹果的使用规范:

对于那些采用了IDFA(Advertising Identifier)广告标识符但没有显示广告的应用,会拒绝该应用的审核上架。

许多第三方的 SDK 中就用到了 IDFA,比如新浪微博的 SDK,所以即使你的应用中没有用到 IDFA,但是在上架的时候一定要检测下应用中是否用到了 IDFA,否则提交应用的时候很容易选成了 没有使用 IDFA而违反苹果上架规定,可以在工程根目录中使用如下的命令检测:

grep -r advertisingIdentifier .

检测结果如下:

可以很清晰的看到哪些文件中用到了 IDFA。如果应用中用到了 IDFA 但没有显示广告,可以在提交应用时按照下图所示来进行选择:

另外,有些第三方的 SDK 比如 ShareSDK(有包含 IDFA 和 不包含的 IDFA 的版本) 提供在应用审核期间临时展示广告功能,方便开发者通过审核。

第三方 SDK

使用最简单、开发成本最低的当然是第三方统计 SDK,这些 SDK 有的使用苹果的 IDFA 来标识唯一设备,有的采用例如 OpenIDFA 等开源方案(比如多盟)或者自研方案(比如 TalkingData 使用自己开发的 TIID)来判断独立设备,也有的通过服务器下发唯一 ID 的方式来判断独立设备。

关于卸载统计

另外值得一提的是,在安卓上做应用的卸载统计时,也有的可以根据推送来进行判断应用是否卸载,有的推送服务使用比较广泛,集成的应用比较多,这就导致了同一台手机上很多个应用使用的都是同一个平台的推送服务,推送 SDK 把这些应用作为一个群组,可以共享长连接通道,如果群组内的某个应用卸载了,这个卸载事件就可以被群组内的其它应用所知晓,这个卸载事件也就可以上报给服务端,服务端也就知道哪个应用被卸载掉了。如果群组内只有一个应用,那么当这个应用卸载时,也就无法统计到了。一般第三方的 SDK 都会采取多种策略组合来进行判断独立设备,以达到比较精准的统计效果。比如某个应用一个月未激活,则认为该设备已经将应用卸载了。在 iOS 上做卸载统计就比较困难了,由于 iOS 的沙盒机制,应用之间通信比较困难,从技术上来说是很难实现的。

开源方案

也有相当一部分开发者采用了开源方案来判断独立设备,这种方案比较灵活,数据准确性能做到心中有数,比如OpenIDFA,通常的做法是使用 OpenIDFA 生成一个唯一的标识符,保存到系统钥匙串中,需要的时候从钥匙串读取,这种做法的好处是可以保证用户在系统升级,甚至删除应用后标识符不会被删除,当用户重新安装应用后依然能读取到钥匙串中保存的标识符。当然,如果用户还原设备,该标识符依然会被删除,不过在 iOS 上用户还原设备的几率比较小,因此采用这种方案获取的数据属于准确度比较高的。

方案选择

总的来说,在应用发展初期,一般需要以低成本加入用户统计功能,第三方 SDK 是首选方案,集成容易,很多 SDK 都支持 cocoapod + 一句话代码集成。等用户规模比较大时,一些需求使用第三方 SDK 就渐渐满足不了,而且用户统计数据对于企业来说都是比较敏感的信息,使用第三方 SDK 会造成用户统计数据很容易被第三方获取,从而造成一些敏感信息泄露。所以使用开源方案或者自研方案替代第三方 SDK 是必须做的。


鼓励一下!

如果你觉得我的文章对你有帮助,可以请我喝杯咖啡。😄