2016 年 12 月 17 日,又拍云 Open Talk 有米科技专场在广州举办。此次 Open Talk 邀请了有米科技(834156.SZ)技术团队的4位大咖探讨技术领导力、大数据和用户画像、在线业务扩容的技术选型等话题。以下是有米科技研发经理陈建峰分享的《基于Apple IDFA的开源项目:有米SimulateIDFA》。

大家好,今天给大家带来的是IDFA替代方案的分享,IDFA是什么东西?这是一个设备ID,我先从设备ID开始介绍。

什么是设备ID?

设备ID是一个统称,只要符合设备ID这几个特点的设备参数都可以当做设备ID用,它的特点有三个:

  • 唯一,只标记一部设备;
  • 稳定,今天拿到设备ID是这个值,明天拿到也是这个值;
  • 同一设备上的所有App获取的值相同,这两个设备ID不匹配就不可能把两个数据整合在一起。

设备ID可用于统计用户新增、留存、活跃等。比如一个App在有米上投了一个广告,我们会通过匹配设备ID来得知这个App是从哪个渠道吸引过来的。设备ID对于基理数据来提供个性化服务的企业来说比较有价值,你要进行后面的数据化,根据用户的兴趣爱好推送一些他喜欢的广告,你必须能够标记到那个用户,如果没有用户系统就必须要用到设备ID,把一个设备ID是当成一个人的ID这样来匹配。

UDID(Unique Device Identifier)唯一设备标志

UDID=SHA1(serial + IMEI + wifiMAC + bluetoothMAC)

接下来看一下iOS系统上设备ID的登记,苹果有提供一个设备的ID叫UDID,它的意义就是唯一设备标识,像设备序列号,它的存储方法是把设备序列号、IMEI、WIFIMAC、Bluetoothmac做唯一标识,这个对于iOS系统来说是非常重要的ID,苹果用这个ID来进行服务,比如说你在App Store上下载一个App,会影响拉高这个App的排名。

有一些团队破解了AppStore的下载流程,苹果在购买的时候要呈现一个设备ID,会把UDID记录在自己的数据库里,刷榜的人如果要模仿UDID必须要有这四个参数,苹果把这个跟后台数据匹配,如果不存在,这部分下载量就不会对榜单产生影响,在iOS5,苹果没有说哪个接口可以代替UDID,UDID是基于剪切法来共享的原理,后来发现UDID是存放在剪切版里的,也有人在找有什么比较好的方案,设定好每个Mac是唯一的,所以Mac也是设备ID,因为它唯一,而且很稳定,所以在iOS上面大家公认的方案就是用Mac。

iOS系统更新带来的设备ID变革

然后就到了iOS6系统,iOS6发布的时候,苹果官方出了一个IDFA的设备ID,叫广告标记ID,就是给广告服务商提供的设备ID,它有一个缺点:用户可以在手机的设置—通用—隐私功能里去还原这个设备,如果还原了,下次拿到的IDFA就是不一样的,没有那么稳定。苹果还推出了一个IDFV的标记,IDFV的意思就是给同一个开发者帐号用,同一个开发者帐号拿到的IDFA是一样的,不同的的开发者拿到的不同的数据库是不可以匹配的。

同一个App里拿到ID,前两个字段一样的话,就会认为是同一个开发者,同时还推出了一个限制广告追踪的协议,大家可以在手机的设置-隐私可以看到是否限制广告追踪,如果点击了限制广告追踪,你在使用IDFV的同时,必须要拿这个标记,看用户是否限制广告追踪,你不能拿IDFV来计算他的兴趣爱好,不能通过IDFV计算他可能对哪些广告感兴趣,这只是一个口头协议,并没有什么约束力,但是在iOS6上面还可以用,也没有被苹果禁止,采用方案跟iOS5方案一样。

当iOS7发布的时候,苹果做了两个限制,一个是iOS Mac地址获取不了,Open UDID被限制,它限制了剪切板不能被各个App共享,但是IDFA的缺点比较致命,如果我想统计的一个用户把IDFA还原了,我们会以为是一个新增用户。为了弥补这个缺点,我们在iOS7以上采用的方案是把IDAF存放在keychain,keychain是每个APP都可以访问的,App卸载了,但是数据并不会清空,这个能弥补IDFA在稳定性上的缺点,因为如果你的keychain被卸载了,你再重新安装发现数据还在,可以判断这并不是新增用户,可以根据这两个结合来模拟一个比较理想的设备ID。IDFA的获取后面也做了一些限制,我们在2014年年初收到了很多开发者的反馈,他们拿了IDFA苹果拒绝他们上架,大家拿到了IDFA就会被展示一个差评,但是在审核的时候,把广告给展现出来,就会给你通过,通过以后再把这个差评给去掉。

我记得在4月初,苹果升级了IDFA后台,提交App的时候,会问你是否拿了IDFA?是否拿IDFA在App里放广告?是否用来投放广告?这样在审核的时候,苹果就不会拒绝你的App上架,以后我们都要用IDFA做设备的标记来弥补它的稳定性,在iOS7发布的时候,苹果又开启限制广告追踪,如果用户开了限制广告追踪,你就拿不到IDFA,拿不到设备ID的,每个ID拿到的IDFA是一样的,投放广告的时候可以知道是来自于哪个渠道,如果拿不到就不知道是哪个渠道投放,而且开启这个功能的用户可能是20%,20%已经是比较大量的用户了,出了这个之后,我们就研究有没有替换IDFA的方案,就有了SimulatIDFA。

image.png
SimulateIDFA如何实现唯一性

SimulateIDFA会生成一个ID,让每一个拿到的ID是同一个值,实现这个分好几步:首先让系统共有ID尽可能的满足这个用户,然后看一下是不是每个App拿的设备参数都相同,设备参数是不是可以标记一定范围的设备,然后再区分这些设备ID,如果有一个系统变量改变了,可能就会把收集的这些参数用来组合,稳定了之后,用来计算后16位。

SimulateIDFA前16位计算的参数有:系统版本、硬件型号、运营商信息、硬盘容量、核心文件创建、修改时间,后16位计算的参数有:系统开机时间、国家代码、系统语言、设备名称。

SimulateIDFA的唯一性:

在最坏的情况下SimulateIDFA生成方案的唯一性表现:

假设一个情况,一天内某个国家有10000000(1千万)台相同型号的设备升级到同一个系统。

核心文件创建/修改时间:24*3600

设备开机时间:1(时间精确到天,没精确到秒)

系统版本:1

硬件型号:1

运营商信息:10

文件系统大小(NSFileSystemSize):10000000

国家代码:1

系统语言:1

设备名称:9000000(设备名称范围,这里假设的是每10台就有2个重复,名称范围就是10000000*0.9)

这些组合的所有可能值为:

24*3600*10*10000000*9000000=77760000000000000000

假设设备a的SIDFA为K,设备b的SIDFA为K的可能性为1/ 77760000000000000000。

这10000000台设备中,可能有另外的设备值为K的可能性为:

77760000000000000000*10000000 = 1/7776000000000。

每一个参数所有的可能情况,举一个最坏的情况下看一下它的唯一性。某一天苹果发布一个新系统,假设某一个国家有1000万台相同型号的设备升级到这个系统,这样会产生碰撞值的可能性如上图。比方说你想精确定位某一个设备A,假设设备A的值为K,那在这1000万台设备里和A一样值的概率就是最后那个,这就是SimulateIDFA的唯一性。

任何一个参数改变,SimulateIDFA都会改变,通过这些参数组合一个值,那里面刚才参数的任何一个改变都会导致它的改变,弥补这个缺点可以跟弥补IDFA的方案一样,把IDFA放在Keychain里面看它的稳定性。

这就是我要分享的内容,谢谢大家!


关于 Open Talk

又拍云Open Talk是又拍云在2014年启动的开放式主题分享沙龙,每月一期。

Open Talk秉承了又拍云帮助企业提升发展速度的初衷,组织资深、一线的工程师,用全干货分享的形态,为互联网从业人员呈现先进的IT技术、理念、解决方案,帮助与会者不断提升自身的专业技能,推动企业更快发展。