利用SAMKeyChain生成唯一设备号

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.

posted @ 2021-03-09 19:48  wjwdive  阅读(785)  评论(0编辑  收藏  举报