iOS之根据UUID和Keychain来确定一台iOS设备

今天公司项目需要获取iOS设备的唯一标识符。但是自在iOS7之后,伟大的Apple公司已经把系统提供获取唯一标识符的的API给禁用了。存在私有的API可以获取,但是会影响到上架,所以直接不考虑。然后网上搜了一下那些demo,发现不是存在BUG,就是用不了。于是自己花了点时间来整理了一下收集来的资料,整合成了一个绝对能用的例子。

首先获取到的UUID在删除掉应用之后,是会变的。所以我们需要用到钥匙串来存起来,而钥匙串的操作是比较麻烦的,用不好是随时会导致应用闪退,所以我们就用到一个比较成熟的第三方SAMKeychain,简单又粗暴。这就是为什么每个程序员都热爱开源的原因了。后面附上下载地址 https://github.com/soffes/SAMKeychain

可以用CocoaPods、也可以直接拖进去项目里面,详细的操作在github上面作者有说明,这就不重复说了。

然后在我们项目中导入 Security.framework,如下截图

iOS之根据UUID和Keychain来确定一台iOS设备_第1张图片

然后在我们需要用到的类中导入头文件 SAMKeychain.h

iOS之根据UUID和Keychain来确定一台iOS设备_第2张图片

工欲善其事,必先利其器。准备工作差不多了,就开始开始干活...

先附上获取 UUID 和保存到钥匙串的代码

/**
 * 这个方法返回 UUID
 */
- (NSString *)getDeviceId {
    // 读取设备号
    NSString *localDeviceId = [SAMKeychain passwordForService:kKeychainService account:kKeychainDeviceId];
    if (!localDeviceId) {
        // 如果没有UUID 则保存设备号
        CFUUIDRef deviceId = CFUUIDCreate(NULL);
        assert(deviceId != NULL);
        CFStringRef deviceIdStr = CFUUIDCreateString(NULL, deviceId);
        [SAMKeychain setPassword:[NSString stringWithFormat:@"%@", deviceIdStr] forService:@"com.apple.biubiubiu" account:@"DeviceId"];
        localDeviceId = [NSString stringWithFormat:@"%@", deviceIdStr];
    }
    return localDeviceId;
}

如果就按照上面这样,就以为完成的话,那就错过了最重要的一步,上面这样的操作没问题,但是每次获取到的UUID都不一样,因为项目里面还要有做一步的设置:

就不卖关子了,赶紧给各位看官奉上,请看截图

iOS之根据UUID和Keychain来确定一台iOS设备_第3张图片

这里设置的 com.apple.biubiubiu 要和保存到钥匙串中代码那里的命名一致,不然,你保存起来的UUID也没有读取出来。还是作废的。

好了,完成以上操作的话,是可以实现一台设备唯一一个 UUID 的,即使是删除了应用,再次安装也是从钥匙串中读取出来之前保存的。升级系统也不会印象,唯一缺陷就是刷机之后,所有东西都没有了,钥匙串也会失效,各位根据自己的实际需求看着办吧。


你可能感兴趣的:(IOS专栏)