变更记录

序号 录入时间 录入人 备注
1 2015-03-31 Alfred Jiang -
2 2015-12-23 Alfred Jiang -

方案名称

UDID - 解决方案介绍与比较

关键字

UDID \ UUID \ 设备唯一标识符

需求场景

  1. 需要设备唯一标识符的场景

参考链接

  1. CSDN - IOS7开发~UDID解决方法
  2. 现有IOS设备唯一标示符的方案比较

详细内容

#####1. UDID

1
[[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

1
[[UIDevice currentDevice] identifierForVender]

iOS6 中推出的 UDID 替代方案,该方法对于同一厂商的应用返回相同的值,不同厂商所得到的值不同。

该方案刷机、还原设备后,获得值将会改变。同样注意的是:如果同一厂商安装的所有应用都被卸载后,新安装的同一厂商的应用同样也将获得新的值,而不是原来的值!

由于不能跨厂商,并且软件卸载后再安装有改变的可能性,该方案也并没有被广大开发商接受。

#####6. 广告标识符 advertisingIdentifier (推荐方案)

1
[[ASIdentifierManager sharedManager] advertisingIdentifier];

iOS6 中推出的另一款 UDID 替代方案,该方法对所有厂商的应用返回相同的值。同样提供的是另一个 API , advertisingTrackingEnabled ,该参数表示用户是否希望广告追踪被限定,但该参数仅仅是个布尔值,用于表示用户意愿,不影响 advertisingIdentifier 的读取。

该方法由于是官方提供的,并且所有厂商的应用取到的值相同,所以相对接受度好些,但是由于仅在 iOS6 上适用,所以更多人还是选择了 OpenUDID 的方案。

该方法刷机、还原设备后,获得的值将会改变。此外,用户如果通过 设置->关于本机->广告->还原广告标识符,就可以重新生成一个新的值。

该方法是 iOS7 上目前官方允许的范畴内最为可接受的方案。

#####7. IMEI

iOS 官方 API 无法获得 IMEI ,或者说禁止获取。故很少有人在 iOS 上去读取 IMEI 。但 IMEI 作为设备唯一标识符是最为准确的方法之一!不会随着刷机、还原设备而改变!

读取 IMEI 的应用将会被 AppStore 拒绝!

同样类似的方案有蓝牙地址、 iOS 设备序列号(SerialNumbedr)等等。

效果图

(无)

备注

(无)