Come ottenere un ID dispositivo univoco in Swift?


181

Come posso ottenere un ID univoco di dispositivi in ​​Swift?

Ho bisogno di un ID da utilizzare nel database e come chiave API per il mio servizio Web nella mia app social. Qualcosa per tenere traccia di questi dispositivi di uso quotidiano e limitare le loro query al database.

Grazie!

Risposte:


386

Puoi usare questo (Swift 3):

UIDevice.current.identifierForVendor!.uuidString

Per le versioni precedenti:

UIDevice.currentDevice().identifierForVendor

o se vuoi una stringa:

UIDevice.currentDevice().identifierForVendor!.UUIDString


Non è più possibile identificare in modo univoco un dispositivo dopo che l'utente ha disinstallato le app. La documentazione dice:

Il valore in questa proprietà rimane lo stesso mentre l'app (o un'altra app dello stesso fornitore) è installata sul dispositivo iOS. Il valore cambia quando l'utente elimina dal dispositivo tutte le app di quel fornitore e ne reinstalla una o più.


Puoi anche leggere questo articolo di Mattt Thompson per maggiori dettagli:
http://nshipster.com/uuid-udid-unique-identifier/

Aggiornamento per Swift 4.1 , dovrai utilizzare:

UIDevice.current.identifierForVendor?.uuidString

forse aggiungere .UUIDString in modo che possa effettivamente essere inviato a un server?
Daniel Galasko,

2
Sì. Ho pensato che fosse la cosa ovvia da fare, ma l'ho inclusa nella risposta.
Atomix,

19
Dopo la disinstallazione dell'app questo numero non è più lo stesso. Esiste un modo per tracciare un dispositivo anche dopo la disinstallazione dell'app?
jmcastel,

5
domanda migliore è, se viene rimosso dopo la disinstallazione, come si elimina il proprio account sul server quando l'ID non è più in uso?
Jason G,

2
@UmairAfzal Molte cose non funzionano nel simulatore. L'hai provato sul dispositivo reale?
Atomix,

10

È possibile utilizzare la proprietà pubblica identifierForVendor presente nella classe UIDevice

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

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

MODIFICA FINE

Schermata per la gerarchia delle proprietà


3
Questa è solo una copia della risposta di @Atomix
Ashley Mills,

10

Per Swift 3.X ultimo codice di lavoro, facile utilizzo;

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

3
Ciò cambia ogni volta che si utilizza la disinstallazione e l'installazione dell'app di nuovo.
iPeter,

7
Questa è solo una copia delle risposte di @Atomix e JayprakasDubey
Ashley Mills,

10

È possibile utilizzare la documentazione Apple di devicecheck (in Swift 4)

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" ...
    }
}

Utilizzo tipico:

In genere, si utilizzano le API DeviceCheck per assicurarsi che un nuovo utente non abbia già riscattato un'offerta con un nome utente diverso sullo stesso dispositivo.

L'azione del server richiede:

Vedi WWDC 2017 - Sessione 702

altro dall'articolo di Santosh Botre - Identificatore univoco per i dispositivi iOS

Il server associato combina questo token con una chiave di autenticazione ricevuta da Apple e utilizza il risultato per richiedere l'accesso ai bit per dispositivo.


1
Se lo capisco correttamente, la generazione di token viene eseguita utilizzando DCDevice.generateToken () e ogni chiamata genera un device_token unico e casuale. Pertanto, device_token non è persistente, ma effimero. Quello che non capisco è come il server è in grado di associare un token temporaneo a un dispositivo.
user1118764,

@ user1118764 "Imposta due bit: il server delle applicazioni è responsabile della condivisione di questo token e imposta il valore dei bit." leggi di più qui medium.com/@santoshbotre01/… e anche qui dalla documentazione ufficiale developer.apple.com/documentation/devicecheck/… e 702 session developer.apple.com/videos/play/wwdc2017/702
iluvatar_GR

1

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")!)

2
È inutile se l'utente elimina l'applicazione perché anche gli userdefaults vengono eliminati con la disinstallazione dell'applicazione.
Rehan Ali,

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

1
Commenta il codice e / o i dettagli dell'offerta e una spiegazione di come ciò risolve la domanda pubblicata.
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

Il valore di identifierForVendor cambia quando l'utente elimina tutte le app di quel fornitore dal dispositivo, se si desidera mantenere l'ID univoco anche per le successive installazioni successive, è possibile provare a utilizzare la seguente funzione

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

Chi ha mai votato in giù questa risposta, può spiegare perché ha votato in giù? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain sono i metodi personalizzati che devi implementare, non ho incluso quelle definizioni pensando di non aumentare le dimensioni della risposta.
Shihab,

I valori memorizzati nel portachiavi persistono quando l'app viene disinstallata?
Anees,

1
@Anees, hai ragione la mia risposta non è valida da iOS 10.3 Beta 2, elimina automaticamente gli elementi del portachiavi dopo la disinstallazione dell'applicazione, se non ci sono app condivise. Quindi alla fine sarà lo stesso comportamento di identifierForVendor methid.
Shihab,

-18

Ci ho provato

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

anziché

let UUID = NSUUID().UUIDString

e funziona.


30
NSUUID (). UUIDString ti darà una nuova stringa ogni volta
Eric
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.