Подтвердить что ты не робот

Всегда получать уникальный идентификатор устройства в iOS 7

Наше приложение iOS предназначено для конкретных пользователей. Таким образом, для идентификации пользователя использовался уникальный идентификатор устройства. Этот подход работает отлично до iOS 6, потому что каждый раз мы получаем одно значение.

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

В iOS 7 приведенный выше метод возвращает различные значения, и мы получаем проблемы с идентификацией пользователя. iOS 7 предоставляет следующие альтернативные.

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

Мы заменили uniqueIdentifier на identifierForVendor и создали Ad-hoc-сборку. Затем мы установили сборку на устройствах iOS 7 и iOS 6. До сих пор в iOS 7 мы каждый раз получаем одно значение, но iOS 6 дает разные значения каждый раз, когда мы удаляем и переустанавливаем приложение.

4b9b3361

Ответ 1

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

-(NSString *)getUniqueDeviceIdentifierAsString
{
    NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

    NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
    if (strApplicationUUID == nil)
    {
        strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
    }

    return strApplicationUUID;
}

Добавьте в свой проект библиотеку SSKeychain, например. через Cocoapods с pod 'SSKeychain'

Ответ 2

Что заменяет UDID на?

На данный момент похоже, что Apple планирует заменить UDID двумя разными идентификаторами: идентификаторами поставщиков и рекламными идентификаторами.

Идентификаторы поставщиков

Идентификатор идентичен между приложениями того же разработчика. Стереть с удалением последнего приложения для этого идентификатора команды.

Рекламные идентификаторы

Уникально для устройства. Доступно для всех приложений; используется для рекламы - iAd конвертировал из UDID для iOS 6 и более поздних версий. Reset с "Удалить все содержимое и настройки".


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

Рекламные идентификаторы будут по-прежнему создавать уникальный идентификатор устройства, но в отличие от UDID, это можно отключить или reset, так же, как файлы cookie можно контролировать в браузере на рабочем столе или на ноутбуке.

С анонсом iOS7 ранее на этой неделе Apple предприняла дополнительный шаг, который должен был отключить другой уникальный идентификатор - "MAC-адрес", который разработчики приложений и рекламные компании могли использовать вместо нового рекламного удостоверения. Закрывая эту лазейку, Apple делает хороший шаг, вынуждая эти компании использовать только кросс-приложение, которым могут управлять пользователи.

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

Ответ 3

Из Ссылка на класс UIDevice для identifierForVendor:

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

Ответ 4

Существуют ли дополнительные приложения от одного и того же поставщика, установленные на устройствах iOS7? Согласно docs:

Значение в этом свойстве остается неизменным, пока приложение (или другое приложение от того же поставщика) устанавливается на устройстве iOS. Значение изменяется, когда пользователь удаляет все приложения этих поставщиков из устройства и затем переустанавливает один или несколько из них. Значение может также при установке тестовых сборок с использованием Xcode или при установке приложения на устройстве, использующем ad-hoc-распределение. Поэтому, если ваши магазины приложений значение этого свойства в любом месте, вы должны грациозно обрабатывать ситуации, в которых изменяется идентификатор.

Предоставляете ли вы приложение через AppStore? Если нет:

Если приложение не было установлено из хранилища приложений (например, когда приложение все еще находится в разработке), поставщик определяется на основе приложений идентификатор пакета. Предполагается, что идентификатор пакета находится в формате обратного DNS, и первые два компонента используются для генерации идентификатора поставщика. Для Например, com.example.app1 и com.example.app2, по-видимому, имеют тот же идентификатор поставщика.

Ответ 5

Если нет других приложений, подписанных вами, установленных на устройстве, это нормально для идентификатора для поставщика. Кроме того, идентификатор для поставщика может измениться, если вы устанавливаете приложение через различные методы распространения, т.е. приложение может не иметь того же идентификатора для поставщика при установке через XCode и при распределении через TestFlight или HockeyApp.

Ответ 6

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

Ответ 7

Чтобы добавить что-то в ответ nerowolfe, есть отличный Wrapper Keychain с именем MCSMKeychainItem, который, помимо нескольких других вещей, позволяет вам генерировать и извлекать Уникальный идентификатор устройства с одной строкой кода:

[MCSMApplicationUUIDKeychainItem applicationUUID];

поэтому основное использование будет чем-то вроде

+ (NSString *)deviceId {
  // load unique device ID or generate new one
  return [MCSMApplicationUUIDKeychainItem applicationUUID];
}

Он работает на основе Keychain, где он хранит один раз генерируемый уникальный идентификатор (как предложил nerowolf). Это с открытым исходным кодом, и вы можете скачать его здесь, на github.

Примечание: Я не являюсь автором расширения, и я никоим образом не знаю его/ее.