今天公司项目需要获取iOS设备的唯一标识符。但是自在iOS7之后,伟大的Apple公司已经把系统提供获取唯一标识符的的API给禁用了。存在私有的API可以获取,但是会影响到上架,所以直接不考虑。然后网上搜了一下那些demo,发现不是存在BUG,就是用不了。于是自己花了点时间来整理了一下收集来的资料,整合成了一个绝对能用的例子。
首先获取到的UUID在删除掉应用之后,是会变的。所以我们需要用到钥匙串来存起来,而钥匙串的操作是比较麻烦的,用不好是随时会导致应用闪退,所以我们就用到一个比较成熟的第三方SAMKeychain,简单又粗暴。这就是为什么每个程序员都热爱开源的原因了。后面附上下载地址 https://github.com/soffes/SAMKeychain
可以用CocoaPods、也可以直接拖进去项目里面,详细的操作在github上面作者有说明,这就不重复说了。
然后在我们项目中导入 Security.framework,如下截图
然后在我们需要用到的类中导入头文件 SAMKeychain.h
工欲善其事,必先利其器。准备工作差不多了,就开始开始干活...
先附上获取 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都不一样,因为项目里面还要有做一步的设置:
就不卖关子了,赶紧给各位看官奉上,请看截图
这里设置的 com.apple.biubiubiu 要和保存到钥匙串中代码那里的命名一致,不然,你保存起来的UUID也没有读取出来。还是作废的。
好了,完成以上操作的话,是可以实现一台设备唯一一个 UUID 的,即使是删除了应用,再次安装也是从钥匙串中读取出来之前保存的。升级系统也不会印象,唯一缺陷就是刷机之后,所有东西都没有了,钥匙串也会失效,各位根据自己的实际需求看着办吧。
联系客服