it-roy-ru.com

Всегда получайте уникальный идентификатор устройства в 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 и создали специальную сборку. Затем мы установили сборку на устройства iOS 7 и iOS 6. До сих пор в iOS 7 мы получали одно и то же значение каждый раз, но iOS 6 дает разные значения каждый раз, когда мы удаляем и переустанавливаем приложение.

31
jaydev

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

-(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'

31
nerowolfe

Чем заменен UDID?

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

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

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

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

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


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

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

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

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

8
ktnam

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

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

2
neilco

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

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

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

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

2
tilo

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

1
Maggie

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

[MCSMApplicationUUIDKeychainItem applicationUUID];

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

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

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

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

0
FurloSK

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

0
Hussain Shabbir