Wie erhalte ich eine eindeutige Geräte-ID in Swift?

180

Wie kann ich in Swift eine eindeutige Geräte-ID erhalten?

Ich benötige eine ID zur Verwendung in der Datenbank und als API-Schlüssel für meinen Webdienst in meiner sozialen App. Etwas, um den täglichen Gebrauch dieser Geräte zu verfolgen und ihre Abfragen auf die Datenbank zu beschränken.

Vielen Dank!

Benutzer
quelle

Antworten:

385

Sie können dies verwenden (Swift 3):

UIDevice.current.identifierForVendor!.uuidString

Für ältere Versionen:

UIDevice.currentDevice().identifierForVendor

oder wenn Sie eine Zeichenfolge möchten:

UIDevice.currentDevice().identifierForVendor!.UUIDString


Es gibt keine Möglichkeit mehr, ein Gerät eindeutig zu identifizieren, nachdem der Benutzer die App (en) deinstalliert hat. Die Dokumentation sagt:

Der Wert in dieser Eigenschaft bleibt gleich, während die App (oder eine andere App desselben Herstellers) auf dem iOS-Gerät installiert ist. Der Wert ändert sich, wenn der Benutzer alle Apps dieses Anbieters vom Gerät löscht und anschließend eine oder mehrere davon neu installiert.


Vielleicht möchten Sie auch diesen Artikel von Mattt Thompson lesen, um weitere Informationen zu erhalten:
http://nshipster.com/uuid-udid-unique-identifier/

Update für Swift 4.1 , müssen Sie verwenden:

UIDevice.current.identifierForVendor?.uuidString
Atomix
quelle
Vielleicht .UUIDString hinzufügen, damit es tatsächlich an einen Server gesendet werden kann?
Daniel Galasko
2
Jep. Ich dachte, das wäre naheliegend, aber ich habe es in die Antwort aufgenommen.
Atomix
19
Nach der Deinstallation der App ist diese Nummer nicht mehr dieselbe. Gibt es eine Möglichkeit, ein Gerät auch nach der Deinstallation der App zu verfolgen?
JMcastel
5
Die bessere Frage ist, wenn es nach der Deinstallation entfernt wird, wie löschen Sie ihr Konto auf Ihrem Server, wenn die ID nicht mehr verwendet wird?
Jason G
1
@UmairAfzal Viele Dinge funktionieren im Simulator nicht. Haben Sie es auf dem realen Gerät versucht?
Atomix
10

Sie können die öffentliche Eigenschaft identifierForVendor verwenden, die in der UIDevice-Klasse vorhanden ist

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

EDIT Swift 3:

UIDevice.current.identifierForVendor!.uuidString

END EDIT

Screenshot für die Eigenschaftshierarchie

Jayprakash Dubey
quelle
3
Dies ist nur eine Kopie von @Atomix Antwort
Ashley Mills
10

Für Swift 3.X Latest Working Code Einfache Verwendung;

   let deviceID = UIDevice.current.identifierForVendor!.uuidString
   print(deviceID)
SwiftDeveloper
quelle
3
Dies ändert sich immer dann, wenn Sie die App deinstallieren und erneut installieren.
iPeter
7
Dies ist nur eine Kopie der Antworten von @Atomix & JayprakasDubey
Ashley Mills
10

Sie können die Apple-Dokumentation zur Geräteprüfung (in Swift 4) verwenden

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

Typische Verwendung:

In der Regel verwenden Sie die DeviceCheck-APIs, um sicherzustellen, dass ein neuer Benutzer ein Angebot unter einem anderen Benutzernamen auf demselben Gerät noch nicht eingelöst hat.

Serveraktion benötigt:

Siehe WWDC 2017 - Sitzung 702

mehr aus dem Artikel von Santosh Botre - Unique Identifier für die iOS-Geräte

Ihr zugeordneter Server kombiniert dieses Token mit einem Authentifizierungsschlüssel, den Sie von Apple erhalten, und fordert anhand des Ergebnisses den Zugriff auf die Gerätebits an.

iluvatar_GR
quelle
1
Wenn ich es richtig verstehe, wird die Token-Generierung mit DCDevice.generateToken () durchgeführt, und jeder Aufruf generiert ein eindeutiges, zufälliges device_token. Daher ist device_token nicht persistent, sondern kurzlebig. Was ich nicht verstehe, ist, wie der Server einem Gerät ein kurzlebiges Token zuordnen kann.
user1118764
@ user1118764 "Zwei Bits setzen - Der Anwendungsserver ist für die Freigabe dieses Tokens verantwortlich und setzt den Bitwert." Lesen Sie mehr hier medium.com/@santoshbotre01/… und auch hier aus der offiziellen Dokumentation developer.apple.com/documentation/devicecheck/… und 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")!)
n.by.n
quelle
2
Es ist nutzlos, wenn der Benutzer die Anwendung löscht, da die Benutzerstandards auch bei der Deinstallation der Anwendung gelöscht werden.
Rehan Ali
0
if (UIDevice.current.identifierForVendor?.uuidString) != nil
        {
            self.lblDeviceIdValue.text = UIDevice.current.identifierForVendor?.uuidString
        }
Davender Verma
quelle
1
Bitte kommentieren Sie Ihren Code und / oder bieten Sie Details und eine Erklärung an, wie dies die gestellte Frage löst.
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)
        }
    }
}
Joey
quelle
-1

Der Wert von identifierForVendor ändert sich, wenn der Benutzer alle Apps dieses Anbieters vom Gerät löscht. Wenn Sie die eindeutige ID auch für die nachfolgenden Neuinstallationen beibehalten möchten, können Sie versuchen, die folgende Funktion zu verwenden

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
    }
}
Shihab
quelle
Wer hat diese Antwort jemals abgelehnt? Können Sie bitte erklären, warum diese Ablehnung abgelehnt wurde? getCommonPartOfApplicationBundleID (), readFromKeyChain, saveToKeyChain sind die benutzerdefinierten Methoden, die Sie implementieren müssen. Ich habe diese Definitionen nicht berücksichtigt, um die Größe der Antwort nicht zu erhöhen.
Shihab
Bleiben die im Schlüsselbund gespeicherten Werte bei der Deinstallation der App bestehen?
Anees
1
@Anees, Sie haben Recht, meine Antwort ist ab iOS 10.3 Beta 2 nicht gültig. Nach der Deinstallation der Anwendung werden automatisch Schlüsselbundelemente gelöscht, wenn keine freigegebenen Apps vorhanden sind. Schließlich wird es dasselbe Verhalten wie identifierForVendor methid sein.
Shihab
-17

Ich habe es mit versucht

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

stattdessen

let UUID = NSUUID().UUIDString

und es funktioniert.

Matt
quelle
30
NSUUID (). UUIDString gibt Ihnen jedes Mal eine neue Zeichenfolge
Eric