iOS-获取设备的UUID保证唯一性的解决方案
2020-06-23 本文已影响0人
贵叔勇闯天涯
写在前面:
在之前的版本是可以使用UDID获取iOS设备唯一标识:
NSString *udidString = [[UIDevice currentDevice] uniqueIdentifier];
但是iOS5及以后,被苹果禁止使用了(弃用了)
而直接获取的UUID系统不会存储,每次调用的时候都会获得一个新的UUID标示符
一般获取UUID的方法如下
// 普通的获取UUID的方法
+ (NSString *)getUUID {
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString(nil, puuid);
NSString *result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
return result;
}
我们可以通过持久存储这个标识符,来保证即使重新加载,删除后重装应用都能够唯一标识,以下的方式通过获取到UUID后存入系统中的keychain中,来保证以后每次可以得到相同的唯一标志。
实现方案如下:
利用YYKit的keyChain功能来存储所获取的UUID,当keychain有该UUID,直接获取,没有的话,通过系统方法获取:
导入头文件:
#import <YYKit/YYKit.h>
使用keychain的功能需要以下配置:
project -》Capablities-》打开Keychain Sharing开关
代码实现
static NSString * const keyChainUUIDService = @"keyChainUUIDService";
static NSString * const keyChainAccount = @"keyChainAccount";
//获取UUID,将获取的UUID保存到钥匙串里,保证了UUID的唯一不变性
+ (NSString *)getUUIDByKeyChain {
NSString *keyChainUUID;
YYKeychainItem *keychainItem = [[YYKeychainItem alloc] init];
keychainItem.service = keyChainUUIDService;
keychainItem.account = keyChainAccount;
keychainItem = [YYKeychain selectOneItem:keychainItem];
keyChainUUID = keychainItem.password;
if (keyChainUUID.length) {
return keyChainUUID;
}else {
keyChainUUID = [NSUUID UUID].UUIDString;//系统方法获取UUID
if (DGStringIsEmpty(keyChainUUID)) {
return @"";
}
YYKeychainItem *saveKeychainItem = [[YYKeychainItem alloc] init];
saveKeychainItem.service = keyChainUUIDService;
saveKeychainItem.account = keyChainAccount;
saveKeychainItem.password = keyChainUUID;
[YYKeychain insertItem:saveKeychainItem];
return keyChainUUID;
}
}