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

2017-01-14 10:21:19来源:http://www.jianshu.com/p/6f06a3786107作者:甘邦人点击

第七城市

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


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


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


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



加入所需的库.png

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



导入头文件.png

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


先附上获取 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都不一样,因为项目里面还要有做一步的设置:


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



和forService方法中的一致.png

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


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


谢谢阅读~喜欢就点个赞吧,留言也可以。




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台