名词解释
Device ID:设备ID。
IMEI:(International Mobile Equipment Identity)国际移动设备标识的缩写。是由15位数字组成的“电子串号”,它与每台手机一一对应,每个IMEI在世界上都是唯一的。
MEID:(Mobile Equipment Identifier) 移动设备识别码是CDMA手机的身份识别码,也是每台CDMA手机或通讯平板唯一的识别码。
IDFA:(Identifier For Advertising)iOS独有的广告标识符。
UDID:(Unique Device Identifier)唯一设备标识码。
UUID:(Universally Unique Identifier)通用唯一识别码。目前最广泛应用的UUID,是微软公司的全局唯一标识符GUID。其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。
OAID:(Open Anonymous Device Identifier) 开放匿名设备标识符。
GAID:Google Advertising ID。
详细介绍
(1)Device ID
设备ID,具有唯一性。其中又包括IMEI 和 MEID/ESN。一般情况我们获取手机的DeviceId也就是手机的IMEI码。
(2)IMEI
GSM设备返回的,并且是写在主板上的,重装APP不会改变IMEI。
Android:Android 6.0以上系统需要用户授予read_phone_state权限(弹窗授权),如果用户拒绝就无法获得。但是Andorid Q(10.0)版本,将无法获取IMEI,出于用户隐私等一系列安全问题的考虑。将用其他匿名标识符代替,比如OAID。
IOS:iOS 5 之后被禁止。
IMEI是联通、移动手机的标识,MEID是电信手机的标识。
IMEI可以在在移动设备上查询到,一般来说一个双卡手机不止一个IMEI值,全网通双卡手机有两个IMEI和一个MEID。
(3)MEID
在手机键盘直接键入*#06#可获得。
MEID/ESN:CDMA设备返回的,一般不使用。
(4)mac地址
硬件标识符,包括WiFi mac地址和蓝牙mac地址。
Android:Android 6.0之后被禁止,若获取则会被判定为有害应用。
IOS:iOS 7 之后被禁止(同时禁止的还有OpenUDID)。
(5)UDID
用来标示设备的唯一性,由40个字符的字母和数字组成 。
Android:获取UUID后,写入.so文件生成UDID。即使APP重装,值也不变,除非root手机(普通用户做不到)。
IOS:iOS 6 之后被禁止获取系统原生的UDID,但可以通过uuid,写入到钥匙串中,从而获得自定义的UDID(非系统原生),即使用户重装APP,只要每次都取这个钥匙串返回,就是不变的。
OpenUDID:是一个替代 UDID 的第三发解决方案。缺点是如果你完全删除全部带有 OpenUDID SDK 包的 App(比如恢复系统等),那么 OpenUDID 会重新生成,而且和之前的值会不同,相当于新设备。
(6)UUID
APP重装后会改变。
(7)IDFA
IDFA 是苹果 iOS 6 开始新增的广告标识符,用于给开发者跟踪广告效果用的,可以简单理解为 iPhone 的设备临时身份证,说是临时身份证是因为它允许用户更换,IDFA 存储在用户 iOS 系统上,同一设备上的应用获取到的 IDFA 是相同的。iOS 用户可以通过(设置程序 -> 通用 -> 还原 -> 还原位置与隐私)更换 IDFA,iOS 10 系统开始提供禁止广告跟踪功能,用户勾选这个功能后,应用程序将无法读取到设备的 IDFA。(在统计唯一用户的时候,IDFA 的可变性会造成部分用户的重复统计。)
适用于对外:例如广告推广,换量等跨应用的用户追踪等。
总结:iOS 6 时面世,可以监控广告效果,同时保证用户设备不被APP追踪的折中方案。可能发生变化,如系统重置、在设置里还原广告标识符。用户可以在设置里打开“限制广告跟踪”。
(8)OAID
APP类广告效果追踪需要使用到用户的设备标识进行广告点击和转化效果的匹配,而安卓系统当前强依赖于IMEI的获取,上面提到Andorid Q(10.0)版本后,将无法获取IMEI。基于此背景,进行广告投放的效果追踪,需要能够替代及补充IMEI的设备标识。
目前OAID作为目前市场主流的归因补充标识,OAID是由中国信息通讯研究院号召,移动安全联盟推行的安卓设备标识,在无法获取设备号情况下可以使用该标识进行数据匹配,目前主流厂商均已在新版本系统中支持该标识的获取,具有权威性。OAID可以理解为是国内联合推出的广告标识。
与IDFA类似,对于OAID 用户也可以手动在设置中通过重置广告标识符更换OAID或者“限制广告跟踪”。
与OAID相关的设备标识体系中拥有四种设备标识:
(9)GAID
Google推出的广告标识,与IDFA类似。在装了google play service的安卓手机上,才可以获取到GAID。
广告id是用户特殊的,独特的,可重置的广告id,由Google Play Service 提供,它为用户更好的控制,为开发人员提供简单、标准的系统继续使用你的应用程序,它用于广告目的的匿名标示符和或者重置其标示符或者退出以利益为基础的Google Play的应用程序。
主要用于广告定向,并且和IDFA一样 对于GAID 用户也可以自己设置禁止广告跟踪。
整理,借鉴了多个地方的资料,有不准确的欢迎指出!
用户唯一标识
为什么要建设用户唯一标识
如何区分某个用户就是他这个用户,而不是另一个用户,在数据埋点中,是一个非常重要的事情。因为如果做不到用户的唯一识别,那凡是涉及到用户的数据都将是错的(比如用户量、新增用户数、活跃用户数等等)。所以建设用户唯一标识,尤为重要。
基本概念
设计埋点字段的时候,有两个字段是一定要包括的,即设备ID和用户ID。这两个字段应该纳入通用字段,每个埋点的事件都必须要集成收集。
(1)设备ID
使用相应的算法,生成一个设备ID,以唯一识别用户的终端设备。不同终端的设备ID,其生成算法规则不一样,以下列举不同终端的设备ID的生成规则:
AndroidApp
安卓系统历经多次升级,对权限控制越来越严格,唯一识别手机的方法也在发生变化。下面整理一下安卓系统适合做设备唯一标识符的几个标识符,以及其特性:
从表格中看出,IMEI是最适合做设备唯一标识的,奈何获取IMEI需要授予权限且Android 10以后不再开放IMEI的权限。综合起来,安卓系统中,应该按照IMEI ->OAID -> ANDROID_ID的顺序生成设备ID。即先获取IMEI号,获取不到IMEI时获取OAID,获取不到OAID时,再获取ANDROID_ID,然后使用相关算法生成设备ID。
IOS App
苹果系统,可用于识别唯一设备的标识不多,如下图。综合起来,苹果系统生成设备ID的标识符顺序应该是IDFA -> IDFV ->UDID,即先获取IDFA,获取不到在获取IDFV,获取不到IDFV时,再获取UDID,然后使用相关算法生成一个设备ID。
Web网站
Web网站,使用cookie_id作为设备ID,并存储在浏览器的cookie中。
微信小程序
通常做法使用openid作为设备ID,当然也可以自己生产一个ID,作为设备ID。如果用过openid作为设备ID,需要注意微信小程序的冷启动问题(获取 openid 是一个异步的操作,所以会导致数据上报的时候,可能还没获取到openid,这就是导致设备ID为空)。
2)用户ID
用户ID,即用户在业务产品注册的用户账号。
收集到设备ID和用户ID后,就要想办法将设备ID和用户ID关联起来,也即用户唯一标识建模,详见下文。
用户唯一标识建设
设计一个字段,比如就叫distinct_id(设备ID命名为device_id,用户ID命名为user_id)这个字段用于识别唯一用户。凡是统计用户相关的数据时,都以distinct_id作为用户的唯一区别标识。下面,以具体案例进行阐述。
步骤说明:
- 小明在一部手机上启动了app。该手机的device_id为x1,此时生成一个dsitinct_id为d1;
- 小明在这个手机上用账号u1进行登录。此时device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明继续在这手机上使用app。此时device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明退出自己的账号,继续使用app。此时仍然device_id为x1,user_id为u1,dsitinct_id为d1;
- 小明把手机给了小花,小花用自己的账号u2登录app。此时u2去关联x1,因为x1已经与u1关联,故关联失败。所以重新生成一个distinct_id为d2来标识此用户(u2);
- 小花继续使用app。此时device_id为x1,user_id为u2,dsitinct_id为d2;
- 小明换了部新手机,使用app。此时device_id为一个新的x2,后台生成一个新的dsitinct_id为d3;
- 小明在新手机上,使用账号u1登录了app。此时u1去关联x2,因为x2之前没有与账号关联过,所以关联成功,但是u1已经有一个dsitinct_id为d1,所以此时的dsitinct_id仍然为d1;
- 小明继续在新手机上使用app。此时device_id为x2,user_id为u1,dsitinct_id为d1。
此时三个字段的映射关系为:
(1)后续修复
事件字段修复
小明换新手机后,在登录前,系统给分配的dsitinct_id为d3,不符合实际情况,故要将在新手机上登录前的dsitinct_id修复为d1。如下:
映射表修复
1)删除d3与x2的映射关系
2)将x2添加到d1的device_id_list字段