概念
这里讲到的 UIID 和 UDID 是我们开发过程中抽象出来的两个概念。我们可以认为:
-
UIID
: user installed ID, 也就是用户在app
安装周期内,当前app
内记录本机的唯一标识符。 -
UDID
: user device ID,用户在非刷机前提下
,当前app
内记录的本机的唯一标识符
区别在于他们的生命周期。
-
UIID
: 在APP
卸载以后,标识符消失。重新安装app
后生成一个新的 -
UDID
: 不随卸载而改变,除非刷机。
背景
看到这里,肯定会觉得奇怪。
我们通过
iTunes
或其他的 第三方工具看到的本机识别码明明是固定的。 为什么会说刷机之后改变了?
iOS 5
开始,已经不允许开发者直接获取设备上的 UDID
因为涉及用户的隐私。
从那之后,有过许许多多的替代方案用作设备的唯一识别码。我们文首提到的 UIID
和 UDID
就是针对这种方案下做的。
其实,定义唯一标识符的协议方式有很多种。你可以使用自定义的方式,例如加上时间戳、多位随机数等等。特别是跟业务逻辑相关的识别码,一定有一套自己的协议。
而 UIID
和UDID
最大的区别在于存储方式和使用时长的区别。
UIID
根据上文的阐述,这个 ID 是存在 app 安装的周期内的。那么我们可以认为他是一个存在 app 所在沙盒内的一个字符串。我们可以存在 cache
或 NSUserDefault
中
UDID
很多文章中使用了 IDFA
的方式来进行唯一的标识符 直译就是广告 ID
, 在同一个设备上的所有App都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的,用户可以在 设置|隐私|广告追踪 里重置此id的值,或限制此id的使用,故此id有可能会取不到值.
至于持久化,我们可以借用 keychain
来作为保存的对象。
下面是一段 swift
的代码
import AdSupport
import KeychainAccess // 第三方库
fileprivate let keychainServiceName = "igg.gameAssistant.uuid.service"
fileprivate let UDIDKey = "igg.gameAssistant.udid"
fileprivate let keychain = Keychain(service: keychainServiceName)
func createUDID() -> String {
let isUserOpenAdTrackingFuction = ASIdentifierManager.shared().isAdvertisingTrackingEnabled
var UUIDString = ""
if isUserOpenAdTrackingFuction {
UUIDString = ASIdentifierManager.shared().advertisingIdentifier.uuidString.lowercased()
} else {
UUIDString = UUID().uuidString.lowercased()
}
keychain[UDIDKey] = UUIDString
return keychain[UDIDKey]!
}
网友评论