Як отримати унікальний ідентифікатор пристрою в Swift?


181

Як я можу отримати унікальний ідентифікатор пристрою в Swift?

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

Дякую!

Відповіді:


386

Ви можете використовувати це (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

можливо, додайте .UUIDString, щоб його можна було фактично надіслати на сервер?
Даніель Галаско,

2
Так. Я подумав, що це очевидно, що потрібно зробити, але я включив це у відповідь.
Атомікс

19
Після видалення програми це число більше не є тим самим. Чи є спосіб відстежити пристрій навіть після видалення програми?
jmcastel

5
краще питання, якщо його видалити після видалення, як ви видалите їх обліковий запис на сервері, коли ідентифікатор більше не використовується?
Джейсон Г

2
@UmairAfzal У тренажері багато речей не працюють. Ви спробували це на реальному пристрої?
Atomix

10

Ви можете використовувати загальнодоступні властивості identifierForVendor, присутні в класі UIDevice

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

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

END EDIT

Знімок екрана для ієрархії властивостей


3
Це лише копія відповіді @Atomix
Ешлі Міллс

10

Для найсвіжішого робочого коду Swift 3.X , легко використовувати;

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

3
Це змінюється щоразу, коли ви видаляєте та інсталюйте додаток знову.
iPeter

7
Це лише копія відповідей @Atomix & JayprakasDubey
Ешлі Міллс

10

Ви можете використовувати перевірку пристрою (у 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, і використовує результат для запиту доступу до бітів на кожному пристрої.


1
Якщо я правильно це зрозумів, генерація токенів виконується за допомогою DCDevice.generateToken (), і кожен виклик генерує унікальний, випадковий device_token. Отже, device_token не є стійким, а ефемерним. Я не розумію, як сервер здатний асоціювати ефемерний маркер із пристроєм.
користувач1118764

@ user1118764 "Встановити два біти - сервер додатків відповідатиме за обмін цим маркером і встановлює бітове значення." докладніше читайте тут medium.com/@santoshbotre01/…, а також тут з офіційної документації developer.apple.com/documentation/devicecheck/… та 702 сеансу developer.apple.com/videos/play/wwdc2017/702
iluvatar_GR

1

Швидкий 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")!)

2
Марно, якщо користувач видаляє програму, оскільки параметри користувача також видаляються при видаленні програми.
Рехан Алі

0
if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }

1
Будь ласка, прокоментуйте свій код та / або детальну пропозицію та пояснення, як це вирішує розміщене питання.
RyanNerd

-1
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)
        }
    }
}

-1

Значення 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
    }
}

Хто коли-небудь проголосував за цю відповідь, чи можете ви пояснити, чому за це проголосували? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain - це власні методи, які потрібно реалізувати, я не включав тих, хто думає про визначення, щоб не збільшити розмір відповіді.
Шихаб

Чи зберігаються значення, збережені в брелоку, при видаленні програми?
Аней

1
@Anees, ви правильні, моя відповідь не вірна з iOS 10.3 Beta 2, вона автоматично видаляє елементи брелока після видалення програми, якщо немає спільних додатків. Отже, нарешті, це буде та сама поведінка, що ідентифікаторForVendor methid.
Шихаб

-18

Я спробував

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

замість цього

let UUID = NSUUID().UUIDString

і це працює.


30
NSUUID (). UUIDString кожен раз даватиме вам нову рядок
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.