获取设备的唯一标识符细解

iOS中获取设备唯一标识符的方法随着ios版本的更新而变化,iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符。好景不长,因为该唯一标识符与手机一一对应,苹果觉得可能会泄露用户隐私,所以在 iOS 5.0之后该方法就被废弃掉了;iOS 6.0系统新增了两个用于替换uniqueIdentifier的接口,分别是:identifierForVendor,advertisingIdentifier,但这两个接口会在应用重新安装时改变数值,并不是唯一的标示符,所以开发者改为使用WiFi的mac地址来取代;iOS 7中苹果又封杀mac地址,所以开发者再次改变思路使用KeyChain来保存获取到的UDID,这样以后即使APP删了再装回来,也可以从KeyChain中读取回来。

到现在为止,有四种获取UUID的方法:

1.通过UIDevice类获得NSUUID类型的identifierForVendor属性:IDFV iOS 6.0以后

[UIDevice currentDevice].identifierForVendor.UUIDString;

2.通过ASIdentifierManager类获得NSUUID类型的advertisingIdentifier属性:IDFA iOS 6.0以后

[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

3.直接通过NSUUID类获得 UUID iOS6以后才出有NSUUID

[[NSUUID UUID] UUIDString]

4.通过c语言的方法获得  UUID iOS2.0以后

{

    CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);

    CFStringRef strRef = CFUUIDCreateString(kCFAllocatorDefault , uuidRef);

    NSString *uuidString = (__bridge NSString*)strRef;

    CFRelease(strRef);

    CFRelease(uuidRef);

    return uuidString;

笔者做了一个实验:在同一过程中用以上四种方式获取UUID打印结果如下

E0F5670C-3389-49A2-B6AA-FAA20776E518   identifierForVendor

428B4C84-8FF9-4B0E-975F-D6E242F13685    NSUUID

28CA1EDE-83B9-4839-8E2A-21A1EAC77C4C   c方法

3460682D-316F-451E-8BB3-DB4A856F8196     advertisingIdentifier

在同一个手机在工程中用以上四种方法获取UUID时,四种方法获取的UUID值是不同的,但四种方法获得的UUID值都可以作为唯一标示使用,原因很简单,当app第一次运行时便将这个值存在钥匙串里,只要每个设备对应一个值就行,也就是保证每次发给服务器的值是一样的就ok,所以深层次的我们对设备唯一标识符的理解是:只要这是设个设备唯一的值就ok,无论是怎么获取的。

另外,关于iOS系统设备各个唯一标示的区别及详细解释见以下博客

https://www.cnblogs.com/zxykit/p/5320259.html

https://www.jianshu.com/p/7ad22ca88b83?utm_campaign=maleskine&utm_content=note&utm_medium=reader_share&utm_source=weixin&from=timeline&isappinstalled=0

另外,获取mac address作为唯一标示的方法,应该是在ios9之前才能用,笔者用一台iphone6和iphone5系统版本皆为iOS11的设备试过,两台设备的mac address值相同,故综上所述获取iOS设备的可行方法是本文对比的四种,顶多再加一种openUDID的方法(当然都需要钥匙串配合完成)

https://www.jianshu.com/p/29572b756d26 写的很好的关于UUID的

你可能感兴趣的:(移动)