设备码做为激活码的绑定特征,很多时候因为用户的操作不当或者作者的写法逻辑不对,导致激活码容易掉授权。
最好的方法还是用手机的UDID作为设备码,因为UDID刷机也不会改变,因免越狱的限制,必须安装描述文件才能获取到UDID,所以还是有部分用户嫌麻烦或者不会使用。
下面说下怎么使用CFUUID作为设备码。
因为CFUUID是自己生成的,每次打开APP会变,所以我们把生成的CFUUID保存到Keychain里,以便作为唯一设备码使用。(不可刷机,恢复出厂或者一键新机)
从Keychain里获取CFUDID,没有则新生成CFUDID并保存到Keychain
+(NSString*) GetIOSUUID
{
NSError *error;
NSString * string = [SFHFKeychainUtils getPasswordForUsername:@"UUID" andServiceName:@"com.cxkj.597131035" error:&error];
if (!string) {
}
if(error || !string){
NSLog(@"获取密码出错:%@", error);
[self saveUUID];//保存
string = [SFHFKeychainUtils getPasswordForUsername:@"UUID" andServiceName:@"com.cxkj.597131035" error:&error];
}
else{
NSLog(@"获取密码成功!密码为%@",string);
}
return string;
}
+(void)saveUUID
{
CFUUIDRef puuid = CFUUIDCreate( nil );
CFStringRef uuidString = CFUUIDCreateString( nil, puuid );
NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString));
CFRelease(puuid);
CFRelease(uuidString);
NSError *error;
BOOL saved = [SFHFKeychainUtils storeUsername:@"UUID" andPassword:result
forServiceName:@"com.cxkj.597131035" updateExisting:YES error:&error];
if (!saved) {
NSLog(@"保存密码时出错:%@", error);
}else{
NSLog(@"保存密码成功!%@",result);
}
}