需求:获取设备的唯一标识;
设备的唯一编码最好为Mac地址,但是苹果不允许获取设备的Mac地址,只能换成设备的 UUID,但 UUID 在app卸载重装后就会变动,不能很好的满足一台设备绑定一个账号的需求;那就需要处理app卸载后保证UUID不会跟着一起被重置掉;
Keychain (IOS系统钥匙串存储) 存储在iOS系统中,只有手机恢复出场设置时 Keychain 才会跟着一起被删除,app卸载重装时不会影响 keychain 的存储数据;不同App之间Keychain是不能相互访问的,但是可以通过配置Keychain-sharing来解决。因此使用 Keychain 可以解决 UUID 在一个app中保持唯一的问题。
具体解决方式:
KeychainAccess 库是基于 Keychain 封装的库;先用 pods(点击查看pods安装使用方法) 将库引入项目中
pod 'KeychainAccess'
再封装一个工具类来存储和拉取UUID
import UIKit
import KeychainAccess
struct UUIDTool {
static let KEYCHAIN_SERVICE:String = "com.xxxxx.xxxxx" // 需要项目唯一性,建议使用项目的 bundleId
static let UUID_KEY:String = "UUID_KEY"
static func getUUID() -> String{
let keychain = Keychain(service: KEYCHAIN_SERVICE)
var uuid:String = ""
do {
uuid = try keychain.get(UUID_KEY) ?? ""
}
catch let error {
print(error)
}
print("拉取的设备: \(uuid)")
if uuid.isEmpty {
uuid = UUID().uuidString
do {
try keychain.set(uuid, key: UUID_KEY)
}
catch let error {
print(error)
uuid = ""
}
}
return uuid
}
}
使用方法
UUIDTool.getUUID()