iOS Device ID 的前世今生

2017 年 8 月 25 日 CocoaChina Joy___


平时大家喜欢把各种标识符都称为 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 更容易让大家理解吧!


作者:Joy___

链接:http://www.jianshu.com/p/c3c837ee80ff

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


登录查看更多
1

相关内容

标识符(identifier)是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义。在计算机编程语言中,标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名,以建立起名称与使用之间的关系。标识符通常由字母和数字以及其它字符构成。
最新《经济学中的强化学习》2020大综述,42页pdf128篇文献
【综述】自动驾驶领域中的强化学习,附18页论文下载
专知会员服务
169+阅读 · 2020年2月8日
史上最全的 Pinterest 面试资料
九章算法
6+阅读 · 2019年9月5日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
2019,再不做私域流量就晚了?
互联网er的早读课
16+阅读 · 2019年4月10日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
Arxiv
5+阅读 · 2019年2月28日
Arxiv
5+阅读 · 2018年5月16日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
4+阅读 · 2016年12月29日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关VIP内容
最新《经济学中的强化学习》2020大综述,42页pdf128篇文献
【综述】自动驾驶领域中的强化学习,附18页论文下载
专知会员服务
169+阅读 · 2020年2月8日
相关资讯
史上最全的 Pinterest 面试资料
九章算法
6+阅读 · 2019年9月5日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
2019,再不做私域流量就晚了?
互联网er的早读课
16+阅读 · 2019年4月10日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
基于Web页面验证码机制漏洞的检测
FreeBuf
7+阅读 · 2019年3月15日
微软发布Visual Studio Tools for AI
AI前线
4+阅读 · 2017年11月20日
相关论文
Arxiv
5+阅读 · 2019年2月28日
Arxiv
5+阅读 · 2018年5月16日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
4+阅读 · 2016年12月29日
Arxiv
3+阅读 · 2012年11月20日
Top
微信扫码咨询专知VIP会员