声明:本文来自「又拍云主办的Open Talk——拨开大数据迷雾,寻找真实用户」的演讲内容整理。PPT、速记和现场演讲视频等参见“UPYUN Open Talk”官网。
嘉宾:陈建峰,有米科技研发经理。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qianshuguangarch申请入群,备注姓名+公司+职位。
什么是设备ID
设备ID是一个统称,只要符合设备ID这几个特点的设备参数都可以当做设备ID用,它的特点有三个:
- 唯一,只标记一部设备;
- 稳定,今天拿到设备ID是这个值,明天拿到也是这个值;
- 同一设备上的所有App获取的值相同,这两个设备ID不匹配就不可能把两个数据整合在一起。
设备ID可用于统计用户新增、留存、活跃等。比如一个App在有米上投了一个广告,我们会通过匹配设备ID来得知这个App是从哪个渠道吸引过来的。设备ID对于基理数据来提供个性化服务的企业来说比较有价值,你要进行后面的数据化,根据用户的兴趣爱好推送一些他喜欢的广告,你必须能够标记到那个用户,如果没有用户系统就必须要用到设备ID,把一个设备ID是当成一个人的ID这样来匹配。
接下来看一下IOS系统上设备ID的登记,苹果有提供一个设备的ID叫UDID,它的意义就是唯一设备标识,像设备序列号,它的存储方法是把设备序列号、IMEI、WIFIMAC、Bluetoothmac做唯一标识,这个对于IOS系统来说是非常重要的ID,苹果用这个ID来进行服务,比如说你在App Store上下载一个App,会影响拉高这个App的排名。
有一些团队破解了App Store的下载流程,苹果在购买的时候要呈现一个设备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。
SimulateIDFA如何实现唯一性
SimulateIDFA会生成一个ID,让每一个拿到的ID是同一个值,实现这个分好几步:首先让系统共有ID尽可能的满足这个用户,然后看一下是不是每个App拿的设备参数都相同,设备参数是不是可以标记一定范围的设备,然后再区分这些设备ID,如果有一个系统变量改变了,可能就会把收集的这些参数用来组合,稳定了之后,用来计算后16位。
SimulateIDFA前16位计算的参数有:系统版本、硬件型号、运营商信息、硬盘容量、核心文件创建、修改时间,后16位计算的参数有:系统开机时间、国家代码、系统语言、设备名称。
每一个参数所有的可能情况,举一个最坏的情况下看一下它的唯一性。某一天苹果发布一个新系统,假设某一个国家有1000万台相同型号的设备升级到这个系统,这样会产生碰撞值的可能性如上图。比方说你想精确定位某一个设备A,假设设备A的值为K,那在这1000万台设备里和A一样值的概率就是最后那个,这就是SimulateIDFA的唯一性。
任何一个参数改变,SimulateIDFA都会改变,通过这些参数组合一个值,那里面刚才参数的任何一个改变都会导致它的改变,弥补这个缺点可以跟弥补IDFA的方案一样,把IDFA放在Keychain里面看它的稳定性。