理解 : UDID、UUID、IDFA、IDFV

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的声明:

UDID放弃使用.png

关于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 <AdSupport/AdSupport.h>
  NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

在今年iOS10推出后,苹果推出了“限制广告追踪”功能,设置的路径和iOS9一致。
不过通过实际的测试,在iOS10以前,即便用户打开这个功能,商家同样能够获取IDFA,只不过与以前的不同了,每次切换这个开关与点击“还原广告标识符”的效果同样。
而iOS10就不同了,当用户打开这个功能后,商家只能获取到一连串无心义的0

idfa.jpg

总结 :

目前在项目中使用的比较多的也就数IDFV了,其余的几个基本都被苹果淘汰了.
同时关于UUID,由于保证对在同一时空中的全部机器都是惟一的,因此在程序安装的时候生成惟一的UUID而且保存在keychain中,以这个惟一的UUID做为惟一标识符,就能够用于判断惟一设备.变相的做为UDID的用法.app

相关文章
相关标签/搜索