UIID 和 UDID 的生成

概念

这里讲到的 UIID 和 UDID 是我们开发过程中抽象出来的两个概念。我们可以认为:

  • UIID: user installed ID, 也就是用户在 app 安装周期内,当前 app 内记录本机的唯一标识符。
  • UDID: user device ID,用户在 非刷机前提下,当前 app 内记录的本机的唯一标识符

区别在于他们的生命周期。

  • UIID: 在 APP 卸载以后,标识符消失。重新安装 app 后生成一个新的
  • UDID: 不随卸载而改变,除非刷机。

背景

看到这里,肯定会觉得奇怪。

我们通过 iTunes 或其他的 第三方工具看到的本机识别码明明是固定的。 为什么会说刷机之后改变了?

iOS 5 开始,已经不允许开发者直接获取设备上的 UDID 因为涉及用户的隐私。
从那之后,有过许许多多的替代方案用作设备的唯一识别码。我们文首提到的 UIIDUDID 就是针对这种方案下做的。

其实,定义唯一标识符的协议方式有很多种。你可以使用自定义的方式,例如加上时间戳、多位随机数等等。特别是跟业务逻辑相关的识别码,一定有一套自己的协议。
UIIDUDID最大的区别在于存储方式和使用时长的区别。

UIID

根据上文的阐述,这个 ID 是存在 app 安装的周期内的。那么我们可以认为他是一个存在 app 所在沙盒内的一个字符串。我们可以存在 cacheNSUserDefault

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]!
    }

你可能感兴趣的:(UIID 和 UDID 的生成)