Уникальный идентификатор приложения для iPhone

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

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

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

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

Ответ 1

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

Ответ 2

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

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}

Ответ 3

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

Ответ 4

Чтобы сохранить уникальный идентификатор, созданный между установками, вы можете использовать Keychain Made easy with 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 в новой цепочке ключей устройств с помощью кода выше.

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

Ответ 5

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

Ответ 6

Интересно, что Apple с тех пор устарела от уникального идентификатора в 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 предлагает вам не идентифицировать устройство, а вместо него - для установки приложения. Если вы не работаете в определенных условиях, вероятность того, что каждый идентификатор приложения будет соответствовать вашему продукту в любом случае.

Ответ 7

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

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

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

Любые другие идеи?

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

Ответ 9

Не работает iphone, но как насчет того, чтобы сделать хэш чего-то уникального для телефона... о, скажем, номер телефона?

Получение номера iphone

Ответ 10

Snippit:

NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
NSLog(@"Formatted phone number [%@]", phoneNumber);

Я [недавно] запускал этот код как есть на OS 2.2.1 [и OS 3.0].

Он работает так, как ожидается при запуске на устройстве, и возвращает мой номер телефона с полными номерами международного набора [1 в моем случае].

При запуске на симуляторе значение [возвращается] является пустой строкой, поэтому оно работает только на реальном устройстве iPhone.

Я не тестировал его на iPod Touch.

...

На этой неделе разорвите этот код на другом устройстве и получите нулевое значение вместо числа.

В ходе дальнейшего исследования выяснилось, что число, возвращаемое этим фрагментом кода, - это номер, который настроен в iTunes для устройства.

Если вы не вводили номер iPhones в iTunes при активации устройства или, возможно, (как в моем случае), если значение по умолчанию не было номером iPhone и вы все равно нажали OK, так что iTunes не перечисляет номер телефона, когда ваш iPhone этот код вернет пустую строку.

[Выше это отредактированное конкатенация комментариев, которые я недавно опубликовал в другой статье по этой теме в http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]

Ответ 11

Здесь есть еще одна информация о способе ее получения из iTunes, которая может быть полезна для целей тестирования.

Ответ 12

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

- (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;
}