Как получить уникальный идентификатор устройства в Swift?


Как я могу получить уникальный идентификатор устройства в Swift?

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

спасибо!

6 125

6 ответов:

вы можете использовать это (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

на Swift 3.X последний рабочий код, легко использования;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)

вы можете использовать identifierforvendor public property, присутствующий в классе UIDevice

let UUIDValue = UIDevice.currentDevice().identifierForVendor!.UUIDString
        print("UUID: \(UUIDValue)")

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

РЕДАКТИРОВАНИЕ

Screenshot for property hierarchy

можно использовать 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 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")!)

Я пробовал с

let UUID = UIDevice.currentDevice().identifierForVendor?.UUIDString

вместо

let UUID = NSUUID().UUIDString

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