理解 : UDID、UUID、IDFA、IDFV

0708060262 7年前
   <h2>关于UUID的理解 :</h2>    <pre>  <code class="language-objectivec">英文名称是:Universally Unique Identifier,翻译过来就是通用唯一标识符。  UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。  是一个32位的十六进制序列,使用小横线来连接:8-4-4-4-12 。    代码获取的方式:           NSLog(@"uuid = %@",[NSUUID UUID].UUIDString);    但是通过运行程序可以发现,循环10次,每一次打印的值都是不一样的,当然循环的再多,这个值永远不会出现两个一样的值。    所以从某种程序上来说,UUID跟你的设备没有什么关系了。    由于UUID的本身特性,它保证对在同一时空中的所有机器都是唯一的。  所以,需要作为唯一标识码的话,你可以通过保存在keychain或者NSUserDefaults中.</code></pre>    <h2>关于UDID的理解 :</h2>    <pre>  <code class="language-objectivec">所谓UDID指的是设备的唯一设备识别符,移动广告商和游戏网络运营商往往需要通过UDID用来识别玩家用户,并对用户活动进行跟踪。    UDID 在 iOS5.0 的时候已经被抛弃使用了.  代码实现 : [[UIDevice cuurrent] uniqueIdenfier]    在很早之前,苹果宣称如果第三方应用开发者继续分享或者使用iPhone、Mac、AppleWatch的UDID的话,那么他们的应用将会禁止上架。  为什么苹果要在应用中禁止使用呢?那是因为隐私问题。比如我开发了5款App,很多用户都下载了这5款App并使用。  如果我能轻易的获取这些用户的UDID,其实我能拼凑出用户的很多信息。由于UDID本身的隐私属性,之前常常用来做第三方统计和其他的目的。    当然现在也有人使用MAC地址来识别设备,因为MAC地址也唯一的识别了一台设备并且不会被修改,不知道以后苹果会对此如何操作。    UDID是放弃在代码中获取,目前主要用于配置真机调试证书.    因为隐私的问题,苹果就推出了一个identifierForVendor的属性获取UDID,但获取的值只是个替代品.详细往下看</code></pre>    <p>以下是苹果对于禁用UDID的声明:</p>    <p><img src="https://simg.open-open.com/show/187053b5eecbbe3c65a9f7b2fa536604.png"></p>    <p style="text-align:center">UDID放弃使用.png</p>    <h2>关于IDFV的理解 :</h2>    <pre>  <code class="language-objectivec">目前取代获取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的开发者没有办法去区分某一台设备了,而是只能识别某个应用在某台设备上。    ---------------------------------------------------  PS:这里个人觉得不一定对,但是作为一个参考帮助理解吧,我尝试不断同一应用同一设备安装卸载都会生成新的IDFV.  ---------------------------------------------------</code></pre>    <h2>关于IDFA的理解 :</h2>    <pre>  <code class="language-objectivec">代码实现:  #import <AdSupport/AdSupport.h>    NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];    在今年iOS10推出后,苹果推出了“限制广告追踪”功能,设置的路径和iOS9一致。  不过经过实际的测试,在iOS10之前,即使用户打开这个功能,商家一样可以获取IDFA,只不过与之前的不一样了,每次切换这个开关与点击“还原广告标识符”的效果一样。  而iOS10就不一样了,当用户打开这个功能后,商家只能获取到一连串无意义的0</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b82e257c2a4c426e75702634c8289daa.jpg"></p>    <p style="text-align:center">idfa.jpg</p>    <h2>总结 :</h2>    <p>目前在项目中使用的比较多的也就数IDFV了,其他的几个基本都被苹果淘汰了.</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/b810d7e007ad</p>    <p> </p>