变更记录
序号 | 录入时间 | 录入人 | 备注 |
---|---|---|---|
1 | 2015-03-31 | Alfred Jiang | - |
2 | 2015-12-23 | Alfred Jiang | - |
方案名称
UDID - 解决方案介绍与比较
关键字
UDID \ UUID \ 设备唯一标识符
需求场景
- 需要设备唯一标识符的场景
参考链接
详细内容
1. UDID
[[UIDevice currentDevice] uniqueIdentfier]
iOS 官方最早提供的 UDID 方案,根据某一公式,使用设备序列号、网卡地址等信息作为参数计算而来, iOS6 之后该计算公式发生了改变。
该方法返回的结果在所有应用中都相同,并且卸载应用、刷机、还原设备均不会发生改变,是最为准确的设备唯一标示符。
iOS5 之后,该方法被标记为废弃!最终,在 2013 年 5 月 1 号之后, AppStore 禁止任何使用该方法的应用上架。
iOS7 中对外公开的 API 中已经移除了该方法!
2. 网卡地址
通过 Unix 级别的 API 去获取 Wifi 的网卡地址。
该方法属于 UDID 替代方案中最为准确的一种,因为网卡地址不会因为刷机、还原设备而发生改变。故追求唯一性的厂商多选择此种方案!
在 iOS7 之后,应用已经无法获取网卡地址,所以该方案在 iOS7 中也已经被废弃。
3. OpenUDID
开源的一个 UDID 替代方案,原理是利用应用间的剪贴板共享和本地一些必要的缓存信息,让多个应用间共享一个 UUID 。
OpenUDID 在官方废弃 UDID 接口之后,受到广泛的欢迎!可以说是现在大多数应用的 UDID 替代方法。
OpenUDID 在刷机、还原设备后就会产生新的 UDID ,事实上,由于剪贴板的特殊性,如果所有使用了 OpenUDID 的应用被全部卸载之后,再次安装的应用取到的 OpenUDID 将会是一个全新的值!
iOS7 中,不同组的应用(即不同厂商)的应用之间不再能共享剪贴板间的数据!
同组(即同一厂商)应用的定义为: Info.plist 中关于软件唯一标示符的字段 CFBundleIdentifier 中的前两段标识符(例如 com.mycompany )相同。
固在 iOS7 中, OpenUDID 也将慢慢失去它的意义。
4. 保存在 NSUserDefault 中 的UUID
在 iOS5 将 UDID 标为废弃之后,官方提供的替代方案。即使用 CFUUIDCreate 生成一个 UUID ,并将之保存在 NSUserDefault 中,用它作为设备标识符。在 iOS6 之后,苹果更推出 NSUUID 来替代 CFUUIDCreate ,但本质是一样的。
UUID 每次都会生成一个新的字符串,也就是说应用被卸载之后,就会被认为是一个新的设备,更不用提刷机、还原设备了。
故基本无人采用 UUID 的方案。
5. 厂商唯一标识符 identifierForVender
[[UIDevice currentDevice] identifierForVender]
iOS6 中推出的 UDID 替代方案,该方法对于同一厂商的应用返回相同的值,不同厂商所得到的值不同。
该方案刷机、还原设备后,获得值将会改变。同样注意的是:如果同一厂商安装的所有应用都被卸载后,新安装的同一厂商的应用同样也将获得新的值,而不是原来的值!
由于不能跨厂商,并且软件卸载后再安装有改变的可能性,该方案也并没有被广大开发商接受。
6. 广告标识符 advertisingIdentifier (推荐方案)
[[ASIdentifierManager sharedManager] advertisingIdentifier];
iOS6 中推出的另一款 UDID 替代方案,该方法对所有厂商的应用返回相同的值。同样提供的是另一个 API , advertisingTrackingEnabled ,该参数表示用户是否希望广告追踪被限定,但该参数仅仅是个布尔值,用于表示用户意愿,不影响 advertisingIdentifier 的读取。
该方法由于是官方提供的,并且所有厂商的应用取到的值相同,所以相对接受度好些,但是由于仅在 iOS6 上适用,所以更多人还是选择了 OpenUDID 的方案。
该方法刷机、还原设备后,获得的值将会改变。此外,用户如果通过 设置->关于本机->广告->还原广告标识符,就可以重新生成一个新的值。
该方法是 iOS7 上目前官方允许的范畴内最为可接受的方案。
7. IMEI
iOS 官方 API 无法获得 IMEI ,或者说禁止获取。故很少有人在 iOS 上去读取 IMEI 。但 IMEI 作为设备唯一标识符是最为准确的方法之一!不会随着刷机、还原设备而改变!
读取 IMEI 的应用将会被 AppStore 拒绝!
同样类似的方案有蓝牙地址、 iOS 设备序列号(SerialNumbedr)等等。
效果图
(无)
备注
(无)