Мне нужно иметь уникальный идентификатор для каждого устройства в ios ios8 до 7 серийных номеров, но больше не работает, я могу использовать? который уникален и не изменяет desistalar приложение и переустанавливает. всегда быть одинаковымуникальный идентификатор для каждого устройства на ios8
ответ
Вы можете сохранить небольшие элементы данных в цепочке ключей, и они сохранятся, даже если приложение будет удалено и переустановлено.
При запуске приложения загрузите серийный номер if, если серийный номер не существует в цепочке ключей, создайте UUID и сохраните его в цепочке ключей. Используйте брелок key
, такой как «SerialNumber».
UUID будет существовать при установке и переустановке на время на этом устройстве и гарантированно будет уникальным во всем пространстве и времени.
решение
создать Keychain
H =
импорт
@interface SimpleKeychain: NSObject
- (недействительными), за исключением: (NSString *) Данные услуги :(ID) данные;
- (id) load: (NSString *) сервис;
- (void) delete: (NSString *) service;
@end
M =
импорт «SimpleKeychain.ч»
@implementation SimpleKeychain
(NSMutableDictionary *) getKeychainQuery: (NSString *) обслуживание { возврата [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge идентификатор) kSecClassGenericPassword (__bridge идентификатор) kSecClass, обслуживание, (__bridge ID) kSecAttrService, обслуживание, (__bridge ID) kSecAttrAccount, (__bridge ID) kSecAttrAccessibleAfterFirstUnlock, (__bridge ID) kSecAttrAccessible, ноль]; }
(void) save: (NSString *) данные службы: (id) данные { NSMutableDictionary * keychainQuery = [self getKeychainQuery: service]; SecItemDelete ((__ bridge CFDictionaryRef) keychainQuery); [keychainQuery setObject: [NSKeyedArchiver archivedDataWithRootObject: data] forKey: (__ bridge id) kSecValueData]; SecItemAdd ((__ мост 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; , если (SecItemCopyMatching ((__ моста CFDictionaryRef) keychainQuery, (CFTypeRef *) & keyData) == NOERR) { @try { RET = [NSKeyedUnarchiver unarchiveObjectWithData: (__ моста NSData *) keyData]; } @catch (NSException * e) { NSLog (@ "Unarchive of% @ failed:% @", service, e); } @finally {} } if (keyData) CFRelease (keyData); return ret; }
(пустоты) удаления: (NSString *) обслуживание { NSMutableDictionary * keychainQuery = [самообслуживания getKeychainQuery: обслуживание]; SecItemDelete ((__ bridge CFDictionaryRef) keychainQuery); }
@end
https://github.com/fabiocaccamo/FCUUID/ – TonyMkenu