Как получить уникальный идентификатор устройства в 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

и это работает.

Другие вопросы по тегам