获取一台设备的唯一标识的方法

  • 现在常用的UUID + keychain结合来实现这个需求。
//    UUID
- (NSString*)uuid {
    CFUUIDRef uuid = CFUUIDCreate( nil );
    CFStringRef uuidString = CFUUIDCreateString( nil, uuid );
    NSString * result = (NSString
*)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
    CFRelease(uuid);
    CFRelease(uuidString);
    return result;
}

1.现在我们获取这个UUID虽然是唯一的,但是不能保证每一次的唯一性,因为当您每一次调用或app卸载的时候,UUID会生成一个不同的。这个时候keychain就起到了作用。
2.所以整个逻辑为:从keychain获取UUID。如果能获取到就去比对,如果获取不到就生成一个保存起来。keychain独立在app之外,是和系统统一等级的,所以您不用担心关掉。

  1. 使用 keychain需要导入 Security.framework和KeychainItemWrapper.h/.m 但是KeychainItemWrapper.h/.m 搜索可以下载下来。拖入工程中。
  • 保存UUID的代码如下:
- (void)saveUuidWithKeyChain {
    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper
alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
    NSString *strUUID = [keychainItem objectForKey:
(id)kSecValueData];
    if (strUUID == nil || [strUUID isEqualToString:@""])
    {
        [keychainItem setObject:[self uuid] forKey:
(id)kSecValueData];
} }

这个方法中accessGroup:这个参数如果设置相同的话,是可以共享的。

  • 从keychain获取UUID的方法如下:
- (NSString *)getKeychain {
    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper
alloc]
initWithIdentifier:@"UUID" accessGroup:@"com.xxx.www"];
    NSString *strUUID = [keychainItem objectForKey:
(id)kSecValueData];
    return strUUID;
}
  • 至此,唯一标示的几个方法算是写完了,大家可以测一下,写在应用在重新安装,从keychain获取的UUID和之前一样。
  • 但这里有个不确定因素,就是系统恢复出厂设置或抹掉所有数据的话,这个方法也有可能就不起作用了,因为他是依靠钥匙串在生存,秘钥挂掉的话,他也就失效了。

你可能感兴趣的:(获取一台设备的唯一标识的方法)