Уникальный идентификатор приложения для iPhone - PullRequest
31 голосов
/ 23 октября 2008

Для приложения iPhone, которое отправляет изображения на сервер, мне нужно каким-то образом связать все изображения с определенного телефона. При каждой отправке я хотел бы отправить уникальный идентификатор телефона. Посмотрел на

  [[UIDevice mainDevice] uniqueIdentifier]<br>
and
  [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

но получаю ошибки в симуляторе.

Есть ли санкционированный Apple способ сделать это?

Ответы [ 13 ]

41 голосов
/ 23 октября 2008

Какие ошибки вы получаете? [[UIDevice currentDevice] uniqueIdentifier] ( отредактировано для исправления API, спасибо Мартин! ) - официально рекомендуемый способ сделать это.

18 голосов
/ 23 октября 2008

Вы также можете использовать CFUUID для генерации UUID. Вот некоторый код:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}
13 голосов
/ 04 ноября 2008

Самым простым и подходящим способом получения уникального идентификатора является использование механизмов, которые Apple явно предоставляет для получения идентификатора - [[UIDevice currentDevice] uniqueIdentifier]. Вы не можете гарантировать, что номер телефона будет уникальным для устройства или что устройство даже будет иметь номер телефона. Кроме того, это ужасная идея, так как это определенное вторжение в личную жизнь пользователя. Даже uniqueidentifier следует хэшировать, если вы собираетесь хранить его любым способом.

8 голосов
/ 30 декабря 2011

Для сохранения уникального идентификатора, который вы создаете между установками, вы можете использовать цепочку для ключей Упростить с помощью SSKeychain : просто установите свой UUID следующим образом:

        [SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];

, а затем позвоните снова в любое время, когда вам это нужно:

NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];

Примечание: Службы и учетные записи должны точно соответствовать .

Затем, если приложение будет удалено и переустановлено, UUID сохранится и после переустановки.

Если вы хотите поделиться этим UUID между устройствами, настройте приложение на использование iCloud. Затем вы можете сохранить UUID в NSUserDefaults, синхронизировать с KeyValueStore, а затем установить UUID в цепочке для ключей новых устройств с кодом, приведенным выше.

Этот ответ был бы очень длинным, если бы я набрал код для всего вышеперечисленного, но здесь достаточно примеров кода, чтобы разобраться во всем этом.

7 голосов
/ 22 августа 2011

Не забывайте, что в iOS 5 uniqueIdentifier устарел, вместо этого следует использовать CFUUID

5 голосов
/ 11 октября 2011

Интересно, что с тех пор Apple устарела uniqueIdentifier в iOS 5 (как упоминалось в gN0Me). Вот соответствующая статья TechCrunch: http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/

Apple предполагает, что вы больше не уникально идентифицируете устройство, а вместо этого идентифицируете пользователя . В большинстве случаев это отличный совет, хотя в некоторых ситуациях все еще требуется глобально уникальный идентификатор устройства. Эти сценарии довольно распространены в рекламе. Поэтому я написал чрезвычайно простую библиотеку, которая точно копирует существующее поведение.

В бесстыдном плагине саморекламы я привожу его сюда в надежде, что кто-то найдет его полезным. Также приветствую всех и любые отзывы / критику: http://www.binpress.com/app/myid/591

Тем не менее, в вашей конкретной ситуации я бы посоветовал пропустить глобально функциональность уникального идентификатора, которую предоставляет моя библиотека, так как это немного излишне для вашей ситуации. Вместо этого я сгенерировал бы простой CFUUID и сохранил бы его в NSUserDefaults. Этот идентификатор будет специфичным для вашего приложения, но позволит вам сгруппировать все фотографии для этой «установки приложения» в вашей базе данных.

Другими словами, отказавшись от метода uniqueIdentifier, Apple предлагает не идентифицировать для каждого устройства, а для каждого приложения установить . Если вы не работаете в особых условиях, скорее всего, на приложение ID в любом случае лучше соответствует вашему продукту.

2 голосов
/ 27 января 2009

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

Что происходит, когда вы продаете свой телефон другому лицу ... тогда этот идентификатор устройства будет принадлежать кому-то другому, поэтому даже если приложение будет удалено с iPhone, его можно будет повторно добавить, и тогда все эти данные будут повторно связан с новым пользователем ... это плохо.

Отличным решением будет использование номера телефона с идентификатором устройства MD5. Другой, который мы придумали, - наличие базы данных SQL Lite с некоторым токеном, хэшированным с идентификатором устройства. Затем, когда приложение удаляется, БД уничтожается, и все данные отключаются. Я думаю, что это может быть слишком хрупким.

Есть еще идеи?

Роб Эллис (PhoneGap / Nitobi)

1 голос
/ 07 июля 2015

Используйте Apple GenericKeyChain, которая является лучшим решением. Вот рабочий образец >> https://developer.apple.com/library/prerelease/ios/samplecode/GenericKeychain/Introduction/Intro.html

Имеете представление о KeyChainAccess >> https://developer.apple.com/library/mac/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-TP9

0 голосов
/ 03 сентября 2012

Вы можете использовать MAC-адрес в качестве уникального идентификатора. Следующая ссылка поможет вам

Как программно получить MAC-адрес iphone

0 голосов
/ 24 июля 2009

У меня был успех с таким кодом:

- (NSString *)stringUniqueID {
    NSString *  result;
    CFUUIDRef   uuid;
    CFStringRef uuidStr;
    uuid = CFUUIDCreate(NULL);
    assert(uuid != NULL);
    uuidStr = CFUUIDCreateString(NULL, uuid);
    assert(uuidStr != NULL);
    result = [NSString stringWithFormat:@"%@", uuidStr];
    assert(result != nil);
    NSLog(@"UNIQUE ID %@", result);
    CFRelease(uuidStr);
    CFRelease(uuid);
    return result;
}    
...