平时大家喜欢把各种标识符都称为 Device ID,面对各种各样的标识符我也是一头雾水,觉得有必要梳理一下。不管这些标识符叫什么名字,出于保护用户隐私的考虑, Apple 不会允许开发者来定位用户的设备,只允许开发者来对 App 进行定位。
IMEI
IMEI(International Mobile Equipment Identity):国际移动设备身份码,在手机组装完成后赋予的一个全球唯一的号码,由于此时 iPhone 只支持单卡,所以 IMEI 和 iPhone 是一一对应的。
iOS 2 提供了一种方法获取 IMEI,但是为了保护用户隐私,iOS 5 以后苹果不再允许获取 IMEI 了,如果你在应用中获取 IMEI,可能会遭到 Apple Store 的拒绝。
IDFA
IDFA(Identifier for Identifier),即广告标识符,多用于用户的广告追踪,是每台设备的唯一 ID,IDFA 存储在用户的系统上。Apple 是不允许开发者追踪用户设备的,但是为了监控广告效果,在 iOS 6 中提供这个折中方案,但 IDFA 也会发生变化,比如重置系统、还原广告标识符等。同时,用户也可以选择是否禁止广告追踪(即商家没办法根据用户的行为偏好推送广告)。
UDID
UDID(Unique Device Identifier):苹果 iOS 设备的唯一识别码,在 iOS 6(2013 年 5 月 ) 以后被 Apple 禁止。
Mac 地址
Mac(Medium/Media Access Control):网络设备的物理地址,如果 IMEI 被认为是设备的唯一标识,那么 Mac 就是网络接口唯一标识。学过计算机网络都知道,在根据 IP 进行物理寻址的时候就是使用的 Mac 地址。
同样由于隐私问题,在 iOS 7 之后无法通过 Mac 地址来标识唯一设备,因为在 iOS 7 之后获取到的 Mac 地址为一固定值。
中期总结
开发者们想尽办法想要追踪用户设备,但是 Apple 明令禁止,经过双方的博弈,最终 IDFA 一统天下。下面这图来源于网络,很明了的阐述了 Device ID 的演进史。
NSUUID
UUID(Universally Unique IDentifier):通用唯一识别码
NSUUID 与之前的 CFUUID 是一致的,只是改成了 Objective-C 的接口而已,NSUUID 每次获取的值都会发生变化,但是它会保持唯一性。
NSString *uuid = [[NSUUID UUID] UUIDString];
IDFV
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 都是不变的。
LC_UUID
其实这个和 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 更容易让大家理解吧!