在个性化安装的思考中,设备唯一标识识别应该是大家都最容易想到的一种匹配方案,也是最符合原生场景的,流程也相对简单:
- 用户浏览wap网页,服务端记录用户对应的某些行为数据信息
- wap引导用户去下载app,并收集设备标识发送至服务端
- 用户跳转至App Store下载app并第一次启动,app也收集设备的标识发送给服务端
- 服务端比对app上传的设备标识,找出具有相同设备标识的wap用户,并下发记录的数据信息
- app根据下发的数据信息还原wap之前的操作,实现无感延续性使用
从场景流程来看,关键在于设备唯一标识的选择,必须app能获取,wap也能获取,那我们先分别分析wap和app在设备唯一标识上的各自选择上有哪些
- app 设备唯一标识
MAC在iOS7之后返回同一值:02:00:00:00:00:00;
UDID(IOS设备的唯一识别码-Unique Device Identifier)在iOS5后就禁止使用了,试图获取会禁止上架;
DeviceToken在iOS9之后app卸载重装会改变,大的升级也会改变,而且用户关闭通知就获取不到。
所以下面说下目前常用的
- UUID
Universally Unique Identifier,通用唯一识别码,每次生成都会不一样,所以第一次启动获取后,存储在钥匙串Keychain中,这样app被删除了,Keychain里的数据依然存在,除非系统重置
- (NSString *)uuid {
CFUUIDRef uuid = CFUUIDCreate( nil );
CFStringRef uuidStr = CFUUIDCreateString( nil, uuid );
NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidStr));
CFRelease(uuid);
CFRelease(uuidStr);
return result;
}
- IDFA—iOS6及之后
广告标示符,它是由系统存储着的,但是若是用户完全重置系统或者还原广告标识,就会生成新值
同时若用户限制此ID的使用,那ID就会取不到值,不过苹果默认是允许追踪此ID的值
- (NSString *)idfaStr {
ASIdentifierManager *asIM = [[ASIdentifierManager alloc] init];
if(asIM.advertisingTrackingEnabled){
return [asIM.advertisingIdentifier UUIDString];
} else{
return nil;
}
}
- IDFV—Vendor标示符,iOS6及之后
来自同一个运营商的应用(com.XXX.APP这里的com.XXX一样)运行在同一个设备上,此ID的值是相同的,不同的运营商应用在同一个设备上的值不同,但是如果同一运营商的app全部删除,重新安装后的ID值会改变
- (NSString *)idfvStr {
return [[UIDevice currentDevice].identifierForVendor UUIDString];
}
在现实项目中,唯一标识的处理一般是:
- 从Keychain中获取唯一标识
- 获取的到直接使用
- 获取不到就生成 UUID 或 IDFV 的值并存储在Keychain中
- wap 设备唯一标识
这一块偶比较不了解,所以咨询了前端的同学,说是现在一般两种方法用的比较多
- cookie 存储,用 cookie 存一个唯一码, 然后记录操作。但如果禁用 cookie 或者 清理 cookie, 储存的数据就没了
- FingerPrint (画布指纹识别),有兴趣的可以查阅FingerprintJS框架,web指纹识别技术通过提取设备的各种特征,据说能达到94%的匿名浏览器区分度,但是通过测试发现同一配置的iPhone拿到的值是一样的,重复率还是挺高的
- 最终选择
综上所述,发现app与wap的唯一标识并无交集点,四不四很惊(jing)喜(xia),所以才有用描述设备体征(IP、Date、操作系统,屏幕尺寸等等)的集合信息作为一个模糊匹配的选择,其实相当于确定手机具体型号
+访问时间
+IP
+ ...
- 操作系统(原先有想过通过UA,不过想到其实wap跟app比对也就是UA中的操作系统具有意义,iPhone的升级率高,容易都是最新系统)
- 设备IP(IP可能会变化,特别在wifi进入蜂窝移动网络,而且同处于一个wifi下,IP相同的的也是很多呀)
- Date — 访问时间(量级较大的情况下,推广过程中,同一时段安装的重复率也不低)
- 设备屏幕尺寸(iOS设备屏幕尺寸种类不多)
确定手机型号还可以wap获取GPU型号,分辨率,等等,app通过获取设备型号在对应表获取GPU型号等,不过苹果手机型号较少,在访问时间容差10分钟或者更短期间内,同一 wifi 下,量级大的 app 出现误判也是容易发生,所以现在这个应该算是最不得已的方式吧
这块目前的信息整理只能得到这样的结果,有更好方式的麻烦告诉偶哟
- 扩展,通过配置文件,wap可获取iOS设备唯一标识符
通过集成苹果的MDM可获取设备信息(UDID、Languages、DeviceID、BatteryLevel等)等很多信息,若只想获取UDID,简单点可通过苹果配置文件获取iOS设备UDID,用户在所有操作之前需完成.mobileconfig描述文件的安装,做不到无痕,而且一般用户对于需要安装配置文件都有一种警惕心态(嗯,偶有的)
具体查阅 Safari获取iOS设备UDID
具体做法可参考 天狐博客:通过Safari浏览器获取iOS设备UDID(设备唯一标识符)