2014-10-24 5 views
1

Мне нужно иметь уникальный идентификатор для каждого устройства в ios ios8 до 7 серийных номеров, но больше не работает, я могу использовать? который уникален и не изменяет desistalar приложение и переустанавливает. всегда быть одинаковымуникальный идентификатор для каждого устройства на ios8

+0

https://github.com/fabiocaccamo/FCUUID/ – TonyMkenu

ответ

0

Вы можете сохранить небольшие элементы данных в цепочке ключей, и они сохранятся, даже если приложение будет удалено и переустановлено.

При запуске приложения загрузите серийный номер if, если серийный номер не существует в цепочке ключей, создайте UUID и сохраните его в цепочке ключей. Используйте брелок key, такой как «SerialNumber».

UUID будет существовать при установке и переустановке на время на этом устройстве и гарантированно будет уникальным во всем пространстве и времени.

0

решение

создать 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