設備碼做為激活碼的綁定特征,很多時候因為用戶的操作不當或者作者的寫法邏輯不對,導致激活碼容易掉授權(quán)。
最好的方法還是用手機的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);
}
}