平时你们喜欢把各类标识符都称为 Device ID,面对各类各样的标识符我也是一头雾水,以为有必要梳理一下。无论这些标识符叫什么名字,出于保护用户隐私的考虑, Apple 不会容许开发者来定位用户的设备,只容许开发者来对 App 进行定位。bash
IMEI(International Mobile Equipment Identity):国际移动设备身份码,在手机组装完成后赋予的一个全球惟一的号码,因为此时 iPhone 只支持单卡,因此 IMEI 和 iPhone 是一一对应的。网络
iOS 2 提供了一种方法获取 IMEI,可是为了保护用户隐私,iOS 5 之后苹果再也不容许获取 IMEI 了,若是你在应用中获取 IMEI,可能会遭到 Apple Store 的拒绝。app
IDFA(Identifier for Identifier),即广告标识符,多用于用户的广告追踪,是每台设备的惟一 ID,IDFA 存储在用户的系统上。Apple 是不容许开发者追踪用户设备的,可是为了监控广告效果,在 iOS 6 中提供这个折中方案,但 IDFA 也会发生变化,好比重置系统、还原广告标识符等。同时,用户也能够选择是否禁止广告追踪(即商家没办法根据用户的行为偏好推送广告)。ide
UDID(Unique Device Identifier):苹果 iOS 设备的惟一识别码,在 iOS 6(2013 年 5 月 ) 之后被 Apple 禁止。ui
Mac(Medium/Media Access Control):网络设备的物理地址,若是 IMEI 被认为是设备的惟一标识,那么 Mac 就是网络接口惟一标识。学过计算机网络都知道,在根据 IP 进行物理寻址的时候就是使用的 Mac 地址。spa
一样因为隐私问题,在 iOS 7 以后没法经过 Mac 地址来标识惟一设备,由于在 iOS 7 以后获取到的 Mac 地址为一固定值。计算机网络
开发者们想尽办法想要追踪用户设备,可是 Apple 明令禁止,通过双方的博弈,最终 IDFA 一统天下。下面这图来源于网络,很明了的阐述了 Device ID 的演进史。日志
UUID(Universally Unique IDentifier):通用惟一识别码code
NSUUID 与以前的 CFUUID 是一致的,只是改为了 Objective-C 的接口而已,NSUUID 每次获取的值都会发生变化,可是它会保持惟一性。cdn
NSString *uuid = [[NSUUID UUID] UUIDString];复制代码
IDFV(identifierForVendor):Vendor 标示符,也被称为厂商标识符。只要用户的设备中没有卸载当前 Vendor 的全部 APP,则不会发生变化。什么是 Vendor ?能够理解成 bundleID 的前两部分,例如对于 com.joy.app_1 和 com.joy.app_2 这两个 bundleID 来讲,就属于同一个 Vendor ,共享同一个 IDFV。
NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];复制代码
IDFV 比较适合追踪用户行为,目前多配合 Keychain 来搭配使用,来保证无论是否卸载重装,IDFV 都是不变的。
其实这个和 Device ID 没什么关系,可是由于也叫 UUID,防止形成误解,因此来解释下。LC_UUID 能够这么理解,是用来标示 Mach-O 的,你若是去查看你 APP 的崩溃日志,你会发现应用的可执行程序和各类库都有本身的 UUID,你在进行符号解析的时候,就须要找到与系统库和你 APP 的 UUID 相同的符号文件来进行堆栈地址还原。下面列举的最后一列是库或者 APP 的 UUID。
Binary Images:
0x107170000 - 0x1071aafff +GYMonitorExample x86_64 <f625eb41ccfa3c0db9ed70c4c083b101>
0x10724b000 - 0x107252fff libBacktraceRecording.dylib x86_64 <ad76d9937807307a8eb90279ce79d84e>
0x107259000 - 0x107260fff libViewDebuggerSupport.dylib x86_64 <f5c61d2ba3ab311ba5495a71e4f67790>
0x107269000 - 0x107548fff Foundation x86_64 <61cd1144bb933571bdb39f9b56cecffe>
0x10779c000 - 0x107b6bfff libobjc.A.dylib x86_64 <5f0e622c86ec3969acfbcaaa10e21a31>复制代码
2017 年的咱们想要经过 UDID、Mac 地址、OpenUDID 来定位用户设备已是不可能啦,由于它们要么是无效,要么是受到了 App Store 的限制。可是若是你想要追踪广告的话,可使用 IDFA,想要用来分析用户行为可使用 IDFV + KeyChain 来解决。
同时那么多标识符都被叫作 UUID,其实它们做用各不相同,或许叫它们 NSUUID、IDFV、LC_UUID 更容易让你们理解吧!