iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?
iOS获取设备ID总结
IDFA解释
关于UUID的理解 :
英文名称是:Universally Unique Identifier,翻译过来就是通用唯一标识符。
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。
是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。代码获取的方式: NSLog(@"uuid = %@",[NSUUID UUID].UUIDString);但是通过运行程序可以发现,循环10次,每一次打印的值都是不一样的,当然循环的再多,这个值永远不会出现两个一样的值。所以从某种程序上来说,UUID跟你的设备没有什么关系了。由于UUID的本身特性,它保证对在同一时空中的所有机器都是唯一的。
所以,需要作为唯一标识码的话,你可以通过保存在keychain或者NSUserDefaults中.
关于UDID的理解 :
所谓UDID指的是设备的唯一设备识别符,移动广告商和游戏网络运营商往往需要通过UDID用来识别玩家用户,并对用户活动进行跟踪。UDID 在 iOS5.0 的时候已经被抛弃使用了.
代码实现 : [[UIDevice cuurrent] uniqueIdenfier]在很早之前,苹果宣称如果第三方应用开发者继续分享或者使用iPhone、Mac、AppleWatch的UDID的话,那么他们的应用将会禁止上架。
为什么苹果要在应用中禁止使用呢?那是因为隐私问题。比如我开发了5款App,很多用户都下载了这5款App并使用。
如果我能轻易的获取这些用户的UDID,其实我能拼凑出用户的很多信息。由于UDID本身的隐私属性,之前常常用来做第三方统计和其他的目的。当然现在也有人使用MAC地址来识别设备,因为MAC地址也唯一的识别了一台设备并且不会被修改,不知道以后苹果会对此如何操作。UDID是放弃在代码中获取,目前主要用于配置真机调试证书.因为隐私的问题,苹果就推出了一个identifierForVendor的属性获取UDID,但获取的值只是个替代品.详细往下看
以下是苹果对于禁用UDID的声明:
关于IDFV的理解 :
目前取代获取UDID的方式:
[[[UIDevice currentDevice] identifierForVendor] UUIDString];关于identifierForVendor . 苹果官方文档有说明.
Normally, the vendor is determined by data provided by the App Store.
If the app was not installed from the app store (such as enterprise apps and apps still in development), then a vendor identifier is calculated based on the app’s bundle ID.
The bundle ID is assumed to be in reverse-DNS format.大概的意思是:
通常, vendor的值根据已经上架到App Store的app决定.
但如果app并不是从AppStore中下载安装,比如说是依然处于开发阶段.
那么vendor这个值会根据app's bundle ID 来计算.bundle ID是反向DNS格式。如:com.example.app参考网上一些博客讲解理解:
此时打印出的字符串UUIDString这个东西不是真正的UDID,而是一个有一点像的替代品。如同我上面所说,UDID是只和iOS设备有关的,而这个identifierForVendor是应用和设备两者都有关的:A应用安装到张三这台设备上,就会产生一个identifierForVendor(比如是:1234);A应用安装到李四这台设备上,就会产生另一个identifierForVendor(比如是:5678);B应用安装到张三这台设备上,又是一个全新的identifierForVendor(比如是:9999),B应用安装到李四这台设备上,还是一个全新的identifierForVendor(比如是:7777)。但是无论A应用安装卸载多少次,产生的是都是1234. 所以我们知道,这个identifierForVendor是一种应用加设备绑定产生的标识符,相当于是:Z(identifierForVendor) = X(某应用) + Y(某设备)。当然,和真正的UDID的区别是显而易见的:也就是说App的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。Vindor标示符,适用于对内:例如分析用户在应用内的行为等。是给Vendor标识用户用的,每个设备在所属同一个Vender的应用里,都有相同的值。其中的Vender是指应用提供商,但准确点说,是通过BundleID的DNS反转的前两部分进行匹配,如果相同就是同一个Vender,例如对于com.somecompany.appone,com.somecompany.apptwo这两个BundleID来说,就属于同一个Vender,共享同一个idfv的值。和idfa不同的是,idfv的值是一定能取到的,所以非常适合于作为内部用户行为分析的主id,来标识用户,替代OpenUDID。注意:如果用户将属于此Vender的所有App卸载,则idfv的值会被重置,即再重装此Vender的App,idfv的值和之前不同。
关于IDFA的理解 :
代码实现:
#import NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];在今年iOS10推出后,苹果推出了“限制广告追踪”功能,设置的路径和iOS9一致。
不过经过实际的测试,在iOS10之前,即使用户打开这个功能,商家一样可以获取IDFA,只不过与之前的不一样了,每次切换这个开关与点击“还原广告标识符”的效果一样。
而iOS10就不一样了,当用户打开这个功能后,商家只能获取到一连串无意义的0
总结 :
目前在项目中使用的比较多的也就数IDFV了,其他的几个基本都被苹果淘汰了.
同时关于UUID,因为保证对在同一时空中的所有机器都是唯一的,所以在程序安装的时候生成唯一的UUID并且保存在keychain中,以这个唯一的UUID作为唯一标识符,就可以用于判断唯一设备.变相的作为UDID的用法.