前言
网上用UDID+iOS一搜索就是一大堆;大都由于时间久远,或是写文章的人不怎么仔细,所以我自己实操并总结了下。基础的知识就不说了,大家先去搜序下了解下大概。
先说下结论
有没有可以获取手机唯一标识的可靠方法?
答案是 ~没有,真的没有,不要费力去找了。但是有些相对稳定的方法。
怎样算是个可靠的读取方法?
1,即使我抹掉这个手机内容,重置这个手机。这个识别号就是不变。
2,这个手机上的所有App读取的识别号都是同一个。
读取方法
1,【不可用】早期苹果自己提供了方法 [UIDevice currentDevice] uniqueIdentifier]
但是,早就被苹果废了,为了安全。
2,【不可用】后来还有人用获取MAC 地址的方法,[self macAddress]
但是,也被苹果废了;这个函数现在只会返回02:00:00:00:00:00。人家苹果也不是吃素的,怎么可能给你们留下口子。
3,【不稳定,不建议使用】再后来有人想出了个法子:
生成一个唯一的随机数,写在系统粘贴板里;其他App从中读取。这个法子的好处就是不依赖硬件id号,不容易被苹果堵住。
后来这个项目作者没有继续维护,他也没有说明原因。这就是著名的OpenUDID。实际上这个方案在去年坑了我一把,因为使用了这个工具导致我的App启动慢2秒钟。(OpenUDID,让我的App启动慢了2秒)
实际上,这个方案已经不太稳定了。原因有,在最新iOS系统上,粘贴板上的内容只能在同一个开发者账号下进行共享。这个其实问题不大,反正不行就不行呗。主要问题在于,粘贴板上内容在什么情况下会被清除是不可预知的?虽然开发文档上说是,只要同个开发者的所有App被删除后就会被删除。我测试结果是,即使全部删除,大概率没有被清除。倒是在某次测试中,突然发现读不到值了。stackoverflow上也有人反馈,粘贴板内容清除的时机不可知。 结论就是,大家不要再用OpenUDID这个方案了。
4,【有一定适用范围】苹果提供的vendor间可共享设备id号
//作用域:可以在同个vendor App间共享。比方,Bundle Identifier只要是 com.zhitian.*开头的App就算是同个vendor。不需要同个开发者账号下。
//稳定性:删除所有vendor App后再重装,id会变化。
[[UIDevice currentDevice] identifierForVendor]
5,【慎用】苹果提供的广告识别号
//作用域:所有App共享同一个id
//稳定性:用户可以在 通用设置->隐私->广告->重置广告id
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]
同时用户也可以在隐私设置里“限制广告追踪”。另外我也没有实测过,苹果对此审核是否非常严格。
6,【有一定适用范围】FCUUID提供的keychain方案,保存在keychain中。
//https://github.com/fabiocaccamo/FCUUID
//作用域:可在同个开发者账号下,同个App group间进行共享
//稳定性:抹掉整个手机内容后,才会变化
NSLog(@"FCUUID : %@",[FCUUID uuidForDevice]);
实际上FCUUID是个所有方案的大综合,里面也提供对于第4,第5种方案的调用方法。
而且,FCUUID还使用iCloud机制进行辅助,提供甄别的精度。
如何挑选方案
到这里大家应该可以理解我说,只有相对稳定的方案的意思了吧。其实可选用的方案也就方法4,5,6。如何挑选看自己需求。
我提供几个思路:
需求1:实现用户没有登录的情况下,也能收藏帖子;如果用户登录后,把之前收藏的帖子转到他名下。
对应方案:其实用最简单的方法4就可以了。
需求2:新装用户,给予一定贴补;
对应方案:方案6最为适用。如果发现一个用户设备号相同,或手机号相同,就认为是一个老用户,没有贴补和奖励。这样可以防止某些职业薅羊毛者,用一台手机换不同卡号。当然他还是可以通过抹掉手机内容后再插新卡的方法,这就增加了他的时间成本。即使这样我们还是没办法避免如图情况:
需求3:甄别不同用户+不同设备,方便调试和统计
对应方案:方案5就可以了。很少有人会去关闭这个选项。
下面要做的:
1,FCUUID是如何使用iCloud机制,又可以达到什么目标?
2,iOS 11开始出现了DeviceCheck,了解其用法。
在分享和交流中成长,欢迎找我交流
网友评论