Как получить уникальный идентификатор устройства в Swift?
Как я могу получить уникальный идентификатор устройства в Swift?
Мне нужен идентификатор для использования в базе данных и в качестве API-ключа для моего веб-сервиса в моем социальном приложении. Что-то для ежедневного использования этих устройств и ограничения его запросов к базе данных.
Спасибо!
12 ответов
Вы можете использовать это (Swift 3):
UIDevice.current.identifierForVendor!.uuidString
Для более старых версий:
UIDevice.currentDevice().identifierForVendor
или если вы хотите строку:
UIDevice.currentDevice().identifierForVendor!.UUIDString
Больше нет способа однозначно идентифицировать устройство после того, как пользователь удалил приложения. В документации сказано:
Значение в этом свойстве остается неизменным, пока приложение (или другое приложение того же производителя) установлено на устройстве iOS. Значение изменяется, когда пользователь удаляет все приложения этого поставщика с устройства, а затем переустанавливает одно или несколько из них.
Вы также можете прочитать эту статью Мэтт Томпсон для более подробной информации:
http://nshipster.com/uuid-udid-unique-identifier/
Обновление для Swift 4.1, вам нужно будет использовать:
UIDevice.current.identifierForVendor?.uuidString
Вы можете использовать Devicecheck (в Swift 4) Apple документацию
func sendEphemeralToken() {
//check if DCDevice is available (iOS 11)
//get the **ephemeral** token
DCDevice.current.generateToken {
(data, error) in
guard let data = data else {
return
}
//send **ephemeral** token to server to
let token = data.base64EncodedString()
//Alamofire.request("https://myServer/deviceToken" ...
}
}
Типичное использование:
Как правило, вы используете API-интерфейсы DeviceCheck, чтобы гарантировать, что новый пользователь еще не выкупил предложение под другим именем пользователя на том же устройстве.
Действия сервера должны:
Смотрите WWDC 2017 - Сессия 702
больше из статьи Santosh Botre - Уникальный идентификатор для устройств iOS
Ваш связанный сервер объединяет этот токен с ключом аутентификации, который вы получаете от Apple, и использует результат для запроса доступа к битам для каждого устройства.
Для Swift 3.X Последний рабочий код, простота использования;
let deviceID = UIDevice.current.identifierForVendor!.uuidString
print(deviceID)
Вы можете использовать общедоступное свойство identifierForVendor, представленное в классе UIDevice
let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
print("UUID: \(UUIDValue)")
РЕДАКТИРОВАТЬ Swift 3:
UIDevice.current.identifierForVendor!.uuidString
КОНЕЦ РЕДАКТИРОВАНИЯ
В Swift 4,5 вы можете получить UUID, используя приведенный ниже код.
print(UIDevice.current.identifierForVendor!.uuidString)
Выход
Кроме того, вы можете получить несколько свойств с подключенного устройства.
UIDevice.current.name // e.g. "My iPhone"
UIDevice.current.model // e.g. @"iPhone", @"iPod touch"
UIDevice.current.localizedModel // localized version of model
UIDevice.current.systemName // e.g. @"iOS"
UIDevice.current.systemVersion // e.g. @"15.5"
Swift 2.2
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let userDefaults = NSUserDefaults.standardUserDefaults()
if userDefaults.objectForKey("ApplicationIdentifier") == nil {
let UUID = NSUUID().UUIDString
userDefaults.setObject(UUID, forKey: "ApplicationIdentifier")
userDefaults.synchronize()
}
return true
}
//Retrieve
print(NSUserDefaults.standardUserDefaults().valueForKey("ApplicationIdentifier")!)
Начиная с iOS 11, вы можете использовать API Apple: DeviceCheck
Если вы, как и я, пытались получить уникальный идентификатор устройства для устройств, которыми вы управляете с помощью системы управления мобильными устройствами (MDM), вы можете использовать конфигурацию управляемых приложений .
Существует особая часть, которую вы можете использовать, и которую можно изменить в вашей системе MDM, и которую вы можете прочитать на стороне приложения:
UserDefaults.standard.object(forKey: «com.apple.configuration.managed»)
Для идентификатора устройства вы можете вызвать свой ключ (но это может быть что угодно) и прочитать его изUserDefaults
выше в вашем приложении. Затем на стороне MDM вы должны установить для этой переменной идентификатор устройства.
В большинстве систем MDM существует несколько переменных, среди которых серийный номер устройства, идентификатор устройства, MEID, MAC-адрес и т. д. В разделе управляемой конфигурации приложения добавьте свой ключ.deviceID
и установите для него переменную, например серийный номер, предоставленную вашей системой MDM. Затем система MDM обновит специальный управляемый раздел UserDefaults, указав этот ключ и другое значение в зависимости от устройства, на котором он установлен, что позволит вам получить доступ к значению из приложения.
Значение identifierForVendor изменяется, когда пользователь удаляет все приложения этого поставщика с устройства. Если вы хотите сохранить уникальный идентификатор даже для последующих новых установок, вы можете попробовать использовать следующую функцию
func vendorIdentifierForDevice()->String {
//Get common part of Applicatoin Bundle ID, Note : getCommonPartOfApplicationBundleID is to be defined.
let commonAppBundleID = getCommonPartOfApplicationBundleID()
//Read from KeyChain using bunndle ID, Note : readFromKeyChain is to be defined.
if let vendorID = readFromKeyChain(commonAppBundleID) {
return vendorID
} else {
var vendorID = NSUUID().uuidString
//Save to KeyChain using bunndle ID, Note : saveToKeyChain is to be defined.
saveToKeyChain(commonAppBundleID, vendorID)
return vendorID
}
}
if (UIDevice.current.identifierForVendor?.uuidString) != nil
{
self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
}
class func uuid(completionHandler: @escaping (String) -> ()) {
if let uuid = UIDevice.current.identifierForVendor?.uuidString {
completionHandler(uuid)
}
else {
// If the value is nil, wait and get the value again later. This happens, for example, after the device has been restarted but before the user has unlocked the device.
// https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor?language=objc
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
uuid(completionHandler: completionHandler)
}
}
}
Я пробовал с
let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString
вместо
let UUID = NSUUID().UUIDString
и это работает.