Только что стало известно, что свойство UIDevice uniqueIdentifier устарело в iOS 5 и недоступно в iOS 7 и выше. Никакой альтернативный метод или свойство, кажется, не доступно или не ожидается.
Многие из наших существующих приложений сильно зависят от этого свойства для уникальной идентификации конкретного устройства. Как мы можем решить эту проблему в будущем?
Предложение из документации в 2011-2012 было:
Особые соображения
Не используйте свойство uniqueIdentifier. Чтобы создать уникальный идентификатор, специфичный для вашего приложения, вы можете вызвать
CFUUIDCreate
функцию для созданияUUID
и записать его в базу данных по умолчанию, используяNSUserDefaults
класс.
Однако это значение не будет таким же, если пользователь удаляет и переустанавливает приложение.
источник
Ответы:
UUID, созданный пользователем
CFUUIDCreate
, уникален, если пользователь удаляет и переустанавливает приложение: вы будете получать новый каждый раз.Но вы можете захотеть, чтобы он не был уникальным, то есть он должен оставаться таким же, когда пользователь удаляет и переустанавливает приложение. Это требует немного усилий, так как наиболее надежным идентификатором для каждого устройства является MAC-адрес. Вы можете запросить MAC и использовать его в качестве UUID.Редактировать: Конечно, нужно всегда запрашивать MAC одного и того же интерфейса. Я думаю, что лучшая ставка сen0
. MAC всегда присутствует, даже если интерфейс не имеет IP / не работает.Редактировать 2: Как указывали другие, предпочтительное решение, так как iOS 6 - это [UIDevice identifierForVendor] . В большинстве случаев вы должны иметь возможность использовать его в качестве замены старого
-[UIDevice uniqueIdentifier]
(но UUID, который создается при первом запуске приложения, - это то, что Apple, похоже, хочет, чтобы вы использовали).Редактировать 3: Таким образом, этот важный момент не теряется в шуме комментариев: не используйте MAC в качестве UUID, создайте хэш с использованием MAC . Этот хеш всегда будет создавать один и тот же результат каждый раз, даже при переустановках и приложениях (если хеширование выполняется одинаково). В любом случае, в настоящее время (2013 г.) в этом больше нет необходимости, если только вам не нужен «стабильный» идентификатор устройства на iOS <6.0.Редактировать 4: В iOS 7 Apple теперь всегда возвращает фиксированное значение при запросе MAC, чтобы специально помешать MAC в качестве основы для схемы ID . Так что теперь вы действительно должны использовать - [UIDevice identifierForVendor] или создать UUID для каждой установки.
источник
Вы можете использовать свой вариант для Apple
UDID
уже. Добрый парень gekitz написал категорию, поUIDevice
которой будет генерироваться некаяUDID
основанная на mac-адресе устройства и идентификаторе пакета.Вы можете найти код на GitHub
источник
02:00:00:00:00:00
когда вы запрашиваете MAC-адрес на любом устройстве. Проверьте здесь: developer.apple.com/library/prerelease/ios/releasenotes/General/…Основываясь на ссылке, предложенной @moonlight, я провел несколько тестов, и, похоже, это лучшее решение. Как говорит @DarkDust, метод проверяет,
en0
который всегда доступен.Есть 2 варианта:
uniqueDeviceIdentifier
(MD5 MAC + CFBundleIdentifier)и
uniqueGlobalDeviceIdentifier
(MD5 MAC), они всегда возвращают одинаковые значения.Ниже тесты, которые я сделал (с реальным устройством):
Надеюсь, это полезно.
РЕДАКТИРОВАТЬ:
Как отмечали другие, это решение в iOS 7 больше не полезно, так
uniqueIdentifier
как больше не доступно, и запрос на MAC-адрес теперь возвращает всегда 02: 00: 00: 00: 00: 00источник
Проверь это,
мы можем использовать связку ключей вместо
NSUserDefaults
класса, чтобы хранитьUUID
созданныеCFUUIDCreate
.таким образом, мы могли бы избежать
UUID
повторного использования для восстановления и получать всегда одно и то жеUUID
для одного и того же приложения, даже если пользователь удалял и переустанавливал снова.UUID
будет воссоздан только при сбросе устройства пользователем.Я попробовал этот метод с SFHFKeychainUtils, и он работает как шарм.
источник
kSecAttrAccessibleAlwaysThisDeviceOnly
. Это гарантирует, что ваш UUID не будет перенесен на любое другое устройство. Чтобы получить доступ к вашему UUID из других приложений, используйтеkSecAttrAccessGroup
ключ.Создайте свой собственный UUID и сохраните его в связке ключей. Таким образом, оно сохраняется даже при удалении вашего приложения. Во многих случаях это также сохраняется, даже если пользователь мигрирует между устройствами (например, полное резервное копирование и восстановление на другое устройство).
По сути, он становится уникальным идентификатором пользователя, насколько вам известно. (даже лучше, чем идентификатор устройства ).
Пример:
Я определяю пользовательский метод для создания
UUID
как:Вы можете сохранить его
KEYCHAIN
при первом запуске вашего приложения. Так что после первого запуска мы можем просто использовать его из цепочки для ключей, не нужно его восстанавливать. Основная причина использования связки ключей для хранения: Когда вы установитеUUID
связку ключей, она сохранится, даже если пользователь полностью удалит приложение, а затем снова установит его. , Таким образом, это постоянный способ его хранения, а это значит, что ключ будет уникальным во всех отношениях.При запуске приложения включите следующий код:
Загрузите файлы SSKeychain.m и .h из sskeychain и перетащите файлы SSKeychain.m и .h в свой проект и добавьте «Security.framework» в свой проект. Чтобы использовать UUID впоследствии просто используйте:
источник
Возможно, вы можете использовать:
Документация Apple описывает идентификатор ForVender следующим образом:
Значение этого свойства одинаково для приложений от одного поставщика, работающих на одном устройстве. Разное значение возвращается для приложений на одном устройстве от разных поставщиков и для приложений на разных устройствах независимо от поставщика.
источник
Вы можете рассмотреть вопрос об использовании,
OpenUDID
который является заменой устаревшихUDID
.В основном для соответствия
UDID
требуются следующие функции:OpenUDID
выполняет вышеуказанное и даже имеет встроенный механизм отказа для дальнейшего рассмотрения.Проверьте http://OpenUDID.org это указывает на соответствующий GitHub. Надеюсь это поможет!
Как примечание, я бы уклонялся от любой альтернативы MAC-адреса. Хотя MAC-адрес выглядит как заманчивое и универсальное решение, убедитесь, что этот низко висящий фрукт отравлен. MAC-адрес очень чувствителен, и Apple вполне может отказаться от доступа к нему, прежде чем вы даже скажете «ОТПРАВИТЬ ЭТО ПРИЛОЖЕНИЕ» ... сетевой адрес MAC используется для проверки подлинности определенных устройств на частных каналах (WLAN) или других виртуальных частных сети (VPN). .. это даже более чувствительно, чем прежний UDID!
источник
Я уверен, что Apple раздражала многих людей этим изменением. Я разрабатываю бухгалтерское приложение для iOS и имею онлайн-сервис для синхронизации изменений, сделанных на разных устройствах. Служба поддерживает базу данных всех устройств и изменений, которые необходимо распространить на них. Поэтому важно знать, какие устройства какие. Я отслеживаю устройства, использующие UIDevice uniqueIdentifier, и за то, что оно того стоит, вот мои мысли.
Создать UUID и сохранить в пользовательских настройках по умолчанию? Ничего хорошего, потому что это не сохраняется, когда пользователь удаляет приложение. Если они позже установятся снова, онлайн-сервис не должен создавать новую запись устройства, что приведет к потере ресурсов на сервере и выдаче списка устройств, содержащих одно и то же, два или более раз. Пользователи увидят более одного «iPhone Боба» в списке, если они переустановят приложение.
Создать UUID и сохранить в цепочке для ключей? Это был мой план, поскольку он сохраняется даже при удалении приложения. Но при восстановлении резервной копии iTunes на новое устройство iOS цепочка для ключей передается, если резервная копия зашифрована. Это может привести к тому, что два устройства будут содержать один и тот же идентификатор устройства, если и старое, и новое устройства находятся в эксплуатации. Они должны быть указаны как два устройства в онлайн-сервисе, даже если имя устройства совпадает.
Сгенерировать хеш MAC-адрес и идентификатор пакета? Это выглядит как лучшее решение для того, что мне нужно. Хэшируя с идентификатором пакета, сгенерированный идентификатор устройства не позволяет отслеживать устройство между приложениями, и я получаю уникальный идентификатор для комбинации приложение + устройство.
Интересно отметить, что собственная документация Apple относится к проверке квитанций Mac App Store путем вычисления хэша системного MAC-адреса, а также идентификатора и версии пакета. Так что это кажется допустимым политикой, независимо от того, проходит ли это через проверку приложения, я пока не знаю.
источник
kSecAttrAccessibleAlwaysThisDeviceOnly
. Это гарантирует, что ваш UUID не восстановится на других устройствах, даже если резервная копия зашифрована.Похоже на iOS 6, Apple рекомендует использовать класс NSUUID .
Из сообщения теперь в документах UIDevice для
uniqueIdentifier
свойства:источник
Может помочь: используйте приведенный ниже код, он всегда будет уникальным, кроме случаев, когда вы стираете (форматируете) свое устройство.
источник
Я хотел бы также предложить переход от
uniqueIdentifier
к этой открытой исходной библиотеке (2 простых категории действительно) , которые используют устройство MAC - адрес вместе с Bundle Identifier App генерировать уникальный идентификатор в приложениях , которые могут быть использованы в качестве замены UDID.Имейте в виду, что в отличие от UDID это число будет различным для каждого приложения.
Вам просто нужно импортировать включенные
NSString
иUIDevice
категории и звонить[[UIDevice currentDevice] uniqueDeviceIdentifier]
так:Вы можете найти его на Github здесь:
UIDevice с UniqueIdentifier для iOS 5
Вот категории (только файлы .m - проверьте заголовки в проекте github):
источник
Вы можете достичь из этого кода: UIDevice-with-UniqueIdentifier-for-iOS-5
источник
MAC-адрес может быть подделан, что делает такой подход бесполезным для привязки контента к конкретным пользователям или реализации функций безопасности, таких как черные списки.
После некоторых дальнейших исследований мне кажется, что на данный момент мы остались без надлежащей альтернативы. Я серьезно надеюсь, что Apple пересмотрит свое решение.
Возможно, было бы неплохо написать Apple по этой теме и / или подать запрос об ошибке / возможности по этому вопросу, поскольку, возможно, они даже не знают о полных последствиях для разработчиков.
источник
UIDevice identifierForVendor
Представленный в iOS 6 будет работать для ваших целей.identifierForVendor
представляет собой буквенно-цифровую строку, которая однозначно идентифицирует устройство поставщика приложения. (Только для чтения)Значение этого свойства одинаково для приложений от одного поставщика, работающих на одном устройстве. Различное значение возвращается для приложений на одном устройстве от разных поставщиков и для приложений на разных устройствах в зависимости от поставщика.
Доступный в iOS 6.0 и позже и объявленный в
UIDevice.h
Для iOS 5 обратитесь к этой ссылке UIDevice-with-UniqueIdentifier-for-iOS-5
источник
Используя SSKeychain и код, упомянутый выше. Вот код для копирования / вставки (добавьте модуль SSKeychain):
}
источник
Следующий код помогает получить UDID:
источник
Это код, который я использую, чтобы получить идентификатор для iOS 5 и iOS 6, 7:
источник
PerformSelector may cause a leak because its selector is unknown
?Начиная с iOS 6, у нас есть
NSUUID
класс, который соответствует RFC4122Apple Link: apple_ref для NSUUID
источник
iOS 11 представила инфраструктуру DeviceCheck. Он имеет полностью защищенное решение для уникальной идентификации устройства.
источник
Рабочий способ получить UDID:
Пример использования RoutingHTTPServer :
Вот содержание
udid.mobileconfig
:Установка профиля не удастся (я не удосужился реализовать ожидаемый ответ, см. Документацию ), но приложение получит правильный UDID. И вы также должны подписать mobileconfig .
источник
Для Swift 3.0, пожалуйста, используйте код ниже.
источник
Ты можешь использовать
Который уникален для устройства во всех приложениях.
источник
Apple добавила новый фреймворк в iOS 11 под названием DeviceCheck, который поможет вам очень легко получить уникальный идентификатор. Прочитайте эту форму больше информации. https://medium.com/@santoshbotre01/unique-identifier-for-the-ios-devices-590bb778290d
источник
Если кто-то наткнулся на этот вопрос, то при поиске альтернативы. Я следовал этому подходу в
IDManager
классе, это коллекция из разных решений. KeyChainUtil - это оболочка для чтения из цепочки для ключей. Вы также можете использоватьhashed MAC address
как своего рода уникальный идентификатор.источник
источник
Мы можем использовать идентификатор ForVendor для ios7,
--Важная заметка ---
UDID и идентификатор ForVendor различаются: ---
источник
Apple скрыла UDID от всех общедоступных API, начиная с iOS 7. Любой UDID, начинающийся с FFFF, является поддельным идентификатором. Приложения «Отправить UDID», которые ранее работали, больше нельзя использовать для сбора UDID для тестовых устройств. (вздох!)
UDID отображается, когда устройство подключено к XCode (в органайзере) и когда устройство подключено к iTunes (хотя вы должны нажать «Серийный номер», чтобы отобразить идентификатор.
Если вам нужно получить UDID для устройства, чтобы добавить его в профиль обеспечения, и вы не можете сделать это самостоятельно в XCode, вам придется пройти их шаги, чтобы скопировать / вставить его из iTunes.
Есть ли способ с тех пор (выпуск iOS 7) получить UDID без использования iTunes на ПК / Mac?
источник
У меня тоже возникла проблема, и решение простое:
источник
Не идеальная, но одна из лучших и ближайших альтернатив UDID (в Swift с использованием iOS 8.1 и Xcode 6.1):
Генерация случайного UUID
И используйте библиотеку KeychainWrapper :
Добавьте строковое значение в цепочку для ключей:
Получить строковое значение из цепочки для ключей:
Удалить строковое значение из цепочки для ключей:
В этом решении используется цепочка для ключей, поэтому запись, хранящаяся в цепочке для ключей, будет сохраняться даже после удаления и повторной установки приложения. Единственный способ удалить эту запись - сбросить все содержимое и настройки устройства. Вот почему я упомянул, что это решение замещения не является идеальным, но остается одним из лучших решений для замены UDID на iOS 8.1 с использованием Swift.
источник
NSLog (@ "% @", [[UIDevice currentDevice] identifierForVendor]);
источник