美文网首页iOS开发记录
iOS上如何唯一识别设备

iOS上如何唯一识别设备

作者: 终生程序员小松哥 | 来源:发表于2019-02-19 16:36 被阅读9次


    前言

    网上用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,了解其用法。

    在分享和交流中成长,欢迎找我交流

    相关文章

      网友评论

        本文标题:iOS上如何唯一识别设备

        本文链接:https://www.haomeiwen.com/subject/yjkfyqtx.html