分享

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

 叹落花 2019-06-21

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

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

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

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


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


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

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

  1. /**
  2. * 这个方法返回 UUID
  3. */
  4. - (NSString *)getDeviceId {
  5. // 读取设备号
  6. NSString *localDeviceId = [SAMKeychain passwordForService:kKeychainService account:kKeychainDeviceId];
  7. if (!localDeviceId) {
  8. // 如果没有UUID 则保存设备号
  9. CFUUIDRef deviceId = CFUUIDCreate(NULL);
  10. assert(deviceId != NULL);
  11. CFStringRef deviceIdStr = CFUUIDCreateString(NULL, deviceId);
  12. [SAMKeychain setPassword:[NSString stringWithFormat:@"%@", deviceIdStr] forService:@"com.apple.biubiubiu" account:@"DeviceId"];
  13. localDeviceId = [NSString stringWithFormat:@"%@", deviceIdStr];
  14. }
  15. return localDeviceId;
  16. }

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

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

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多