iOS 的唯一标识失效以及解决办法
苹果的UDID 在 ios5 后就废弃了。那么怎么办呢,最近看到github上的两个项目。拿来分享一下
项目一:
https://github.com/doubleencore/DEUID
这个工程演示了以下几种uuid:
- NSUUID(ios5后废弃)
- Advertiser ID
- Identifier for Vendor
- OpenUDID
- CFUUID
- NSUUID
有什么区别?
从 API 可用的角度看:
iOS SDK | ios5(以下) | ios5(包括ios5以上) |
---|---|---|
UDID | 可用 | 不可用 |
Advertiser ID | 不可用 | ios6后可用 |
Identifier for Vendor | 不可用 | ios6后可用 |
OpenUDID | 可用 | 可用 |
CFUUID | 可用 | 可用 |
NSUUID | 不可用 | ios6后可用 |
参考文章1.
从持久性的角度(是否会改变)看:
持久性 | 启动应用 | 从后台返回前台 | 还原广告标识 | 重装app | 系统重启 | 系统还原 |
---|---|---|---|---|---|---|
UDID | 不变 | 不变 | 不变 | 不变 | 不变 | 不变 |
Advertiser ID | 不变 | 不变 | 变化 | 不变 | 不变 | 变化 |
Identifier for Vendor | 不变 | 不变 | 不变 | 变化 | 不变 | 变化 |
OpenUDID | 不变 | 不变 | 不变 | 不变 | 不变 | 变化 |
CFUUID | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 |
NSUUID | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 |
Identifier for Vendor在重装app时根据情况有特殊的表现:
它是根据app编译时你设置的BundleIdentifier的前两个域来判断所拥有的app是否共享一个。说得太拗口。举个例子好了。
如果你们的公司开发了三个app(A,B,C),BundleIdentifier分别为 com.hxsmart.666 , com.hxsmart.888 ,com.zhangbh.666
那么当机子安装了以上三个app时,A,B的IDFV是一样的,C的是不一样的。
这时如果这时后续还有新的app(D,E),BundleIdentifier分别为
com.hxsmart.918 , com.zhangbh.000
那么D的IDFV跟之前的A,B一致,E跟之前的C一致。
这时用户卸载了A,B,C中的一个(比如A),重装后,IDFV还是一致,没有变化过。可是一旦ABC都卸载了。你再次重装,A,B,C的IDFV就 变化 了
注意:
- 还原广告标识: 设置–》隐私 –》还原广告标识 (老版本在通用–》关于–》广告)
项目一总结
OpenUDID 最接近于之前废弃的UDID的功能,如果系统还原了,你就当是一台新设备吧
————————————————
项目二:
https://github.com/fabiocaccamo/FCUUID
使用这个工程的要求:
- SDK大于等于ios5
- ARC
- 导入Security.framework
- Key-value storage enabled (target/Capabilities/iCloud/Key-value storage)【可选】
- UICKeyChainStore【可选】(github链接)
这个工程演示了以下几种uuid
- uuid(不可用)
- uuidForKey:key
- uuidForSession
- uuidForInstallation
- uuidForVendor
- uuidForDevice
它们在持久性的不同之处:
持久性 | 启动应用 | 重启应用 | 还原广告标识 | 重装app | 系统重启 | 系统升级 | 系统还原 |
---|---|---|---|---|---|---|---|
uuid | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 |
uuidForKey:key | 不变 | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 |
uuidForSession | 不变 | 变化 | 变化 | 变化 | 变化 | 变化 | 变化 |
uuidForInstallation | 不变 | 不变 | 不变 | 变化 | 不变 | 变化 | 变化 |
uuidForVendor | 不变 | 不变 | 变化 | 不变* | 不变 | 变化 | 变化 |
uuidForDevice | 不变 | 不变 | 不变 | 不变 | 不变 | 不变 | 不变** |
和项目一大同小异,只是多了个系统升级。加*号的情况表示:
- *情况和项目一举的例子一样。Identifier for Vendor
- **只当用户恢复了一个包括keychain’s data的备份时才生效。