我需要为ios ios8中的每个设备使用一个唯一的标识符,然后再使用7个serialnumber但不再有效,我可以使用??这是独一无二的,不会改变应用程序的desistalar并重新安装。总是一样的
答案 0 :(得分:0)
您可以将小数据项保存在钥匙串中,即使删除并重新安装该应用,它们也会一直存在。
在应用程序启动时检索if序列号,如果Keychain中不存在序列号,则创建UUID并将其保存在Keychain中。使用钥匙串key
,例如" SerialNumber"。
UUID将在整个卸载过程中存在并在该设备上重新安装,并保证在所有空间和时间内都是唯一的。
答案 1 :(得分:0)
溶液
创建钥匙串
H =
@interface SimpleKeychain:NSObject
@end
M =
@implementation SimpleKeychain
(NSMutableDictionary *)getKeychainQuery:(NSString *)service { return [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge id)kSecClassGenericPassword,(__ bridge id)kSecClass, service,(__ bridge id)kSecAttrService, service,(__ bridge id)kSecAttrAccount, (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__ bridge id)kSecAttrAccessible, 零]; }
(void)save:(NSString *)服务数据:(id)data { NSMutableDictionary * keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__ bridge CFDictionaryRef)keychainQuery); [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__ bridge id)kSecValueData]; SecItemAdd((__ bridge CFDictionaryRef)keychainQuery,NULL); }
(id)load:(NSString *)service { id ret = nil; NSMutableDictionary * keychainQuery = [self getKeychainQuery:service]; [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__ bridge id)kSecReturnData]; [keychainQuery setObject:(__ bridge id)kSecMatchLimitOne forKey:(__ bridge id)kSecMatchLimit]; CFDataRef keyData = NULL; if(SecItemCopyMatching((__ bridge CFDictionaryRef)keychainQuery,(CFTypeRef *)& keyData)== noErr){ @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__ bridge NSData *)keyData]; } @catch(NSException * e){ NSLog(@" unarchive of%@ failed:%@",service,e); } @finally {} } if(keyData)CFRelease(keyData); 返回; }
(void)delete:(NSString *)service { NSMutableDictionary * keychainQuery = [self getKeychainQuery:service]; SecItemDelete((__ bridge CFDictionaryRef)keychainQuery); }
@end