1、背景
由于传统已知的三种方法获取uuid都不能保证它唯一不变,那么我们可以利用钥匙串服务,来生成并存储一个唯一不变的字符,作为唯一的设备id.
/** 利用CFUUIDCreateString函数生产UUID, 卸载应用重新安装后会不一致*/
+ (NSString *)getUUID{
CFUUIDRef uuid = CFUUIDCreate(NULL);
NSString *UUID = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, uuid);
CFRelease(uuid);
return UUID;
}
/** 卸载应用重新安装后会不一致*/
+ (NSString *)getUUID{
return [UIDevice currentDevice].identifierForVendor.UUIDString;;
}
/** 不会因为应用卸载改变
* 但是用户在设置-隐私-广告里面限制广告跟踪后会变成@"00000000-0000-0000-0000-000000000000"
* 重新打开后会变成另一个,还原广告标识符也会变
*/
+ (NSString *)getUUID{
return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
2、利用SAMKeyChain生成并保存唯一设备号
/*利用SAMKeyChain生成并保存唯一设备号*/
- (NSString *)getDeviceNumber {
// 首先获取钥匙串中的设备号
NSString *deviceNumber = [SAMKeychain passwordForService:kKeyChainService account:kKeyChainAccount];
if (0 == deviceNumber.length) {
// 获取设别id
deviceNumber = [[UIDevice currentDevice] identifierForVendor].UUIDString;
// 将-去掉
deviceNumber = [deviceNumber stringByReplacingOccurrencesOfString:@"-" withString:@""];
[SAMKeychain setPassword:deviceNumber forService:kKeyChainService account:kKeyChainAccount];
}
return deviceNumber;
}
/*使用的时候*/
NSString *deviceNumber = [self getDeviceNumber];
NSLog(@"deviceNumber: %@", deviceNumber);
3、注意事项
假设我们的APP 有普通版:appNormal,收费版:appPro,可能会使用不用的bundleID:com.wjw.appNormal、com.wjw.appPro作为区分生成设备id,两套代码里 “kKeyChainService”,“kKeyChainAccount”里如果都一样,若已经安装了appNormal,后安装的appPro里就能取到之前生成的设备id。如果先安装的app删除,再安装新app,新app就会生成新的设备id.