511 Stimmen

UIDevice uniqueIdentifier veraltet - Was ist jetzt zu tun?

Es ist gerade bekannt geworden, dass die Eigenschaft UIDevice uniqueIdentifier ist veraltet en iOS 5 und ist in iOS 7 und höher nicht verfügbar. Es scheint keine alternative Methode oder Eigenschaft zur Verfügung zu stehen oder geplant zu sein.

Viele unserer bestehenden Anwendungen sind eng mit dieser Eigenschaft verbunden, um ein bestimmtes Gerät eindeutig zu identifizieren. Wie könnten wir dieses Problem in Zukunft angehen?

Die Anregung von die Dokumentation im Zeitraum 2011-2012 war:

Besondere Überlegungen

Verwenden Sie nicht die Eigenschaft uniqueIdentifier. Um einen eindeutigen Bezeichner speziell für für Ihre Anwendung zu erstellen, können Sie die CFUUIDCreate Funktion zur Erstellung einer UUID und schreiben in die Standarddatenbank unter Verwendung der NSUserDefaults Klasse.

Dieser Wert bleibt jedoch nicht derselbe, wenn ein Benutzer die Anwendung deinstalliert und erneut installiert.

274voto

DarkDust Punkte 87647

Eine UUID, die von CFUUIDCreate ist einmalig, wenn ein Nutzer die App deinstalliert und erneut installiert: Sie erhalten jedes Mal eine neue.

Aber Sie möchten vielleicht, dass es so ist no eindeutig sein, d. h. sie sollte gleich bleiben, wenn der Benutzer die App deinstalliert und neu installiert. Dies ist mit einigem Aufwand verbunden, da die zuverlässigste Kennung pro Gerät die MAC-Adresse zu sein scheint. Sie könnten den MAC abfragen und verwenden Sie diese als UUID.

Edit : Man muss natürlich immer die MAC der gleichen Schnittstelle abfragen. Ich schätze, das geht am besten mit en0 . Die MAC ist immer vorhanden, auch wenn die Schnittstelle keine IP hat oder ausgefallen ist.

Bearbeiten 2: Wie bereits von anderen erwähnt, ist die bevorzugte Lösung seit iOS 6 -[UIDevice identifierForVendor] . In den meisten Fällen sollten Sie es als Ersatz für das alte Gerät verwenden können. -[UIDevice uniqueIdentifier] (aber eine UUID, die erstellt wird, wenn die Anwendung zum ersten Mal startet, ist das, was Apple anscheinend verwenden möchte).

Bearbeiten 3: Damit dieser wichtige Punkt nicht im Kommentarrauschen untergeht: Verwenden Sie nicht die MAC als UUID, erstellen Sie eine Hash unter Verwendung des MAC . Dieser Hash erzeugt jedes Mal das gleiche Ergebnis, auch bei Neuinstallationen und Anwendungen (wenn der Hash auf dieselbe Weise durchgeführt wird). Wie auch immer, heutzutage (2013) ist dies nicht mehr notwendig, außer wenn Sie eine "stabile" Gerätekennung unter iOS < 6.0 benötigen.

Bearbeiten 4: In iOS 7 gibt Apple jetzt immer einen festen Wert zurück, wenn der MAC abgefragt wird, um die MAC als Basis für eine ID Regelung. Deshalb sollten Sie jetzt wirklich -[UIDevice identifierForVendor] oder erstellen Sie eine UUID pro Installation.

92voto

Serhii Mamontov Punkte 4922

Sie können Ihre Alternative für Apple verwenden UDID bereits. Freundlicher Kerl gekitz schrieb Kategorie auf UIDevice die eine Art von UDID basierend auf der Mac-Adresse des Geräts und der Bündelkennung.

Sie finden den Code unter github

61voto

Mat Punkte 7528

Auf der Grundlage des von @moonlight vorgeschlagenen Links habe ich mehrere Tests durchgeführt und es scheint die beste Lösung zu sein. Wie @DarkDust sagt die Methode geht zu überprüfen en0 die immer verfügbar ist.
Es gibt 2 Möglichkeiten:
uniqueDeviceIdentifier (MD5 von MAC+CFBundleIdentifier)
y uniqueGlobalDeviceIdentifier (MD5 des MAC), diese geben immer die gleichen Werte zurück.
Nachfolgend die Tests, die ich durchgeführt habe (mit dem echten Gerät):

#import "UIDevice+IdentifierAddition.h"

NSLog(@"%@",[[UIDevice currentDevice] uniqueDeviceIdentifier]);
NSLog(@"%@",[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]);

XXXX21f1f19edff198e2a2356bf4XXXX - (WIFI)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (WIFI)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (3G)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (3G)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (GPRS)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (GPRS)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (AirPlane-Modus)UDID
XXXX7dc3c577446a2bcbd77935bdXXXX - (AirPlane-Modus)GlobalAppUDID

XXXX21f1f19edff198e2a2356bf4XXXX - (Wi-Fi)nach Entfernen und Neuinstallation der App XXXX7dc3c577446a2bcbd77935bdXXXX (Wi-Fi) nach Entfernen und Installieren der App

Ich hoffe, es ist nützlich.

EDIT :
Wie bereits erwähnt, ist diese Lösung in iOS 7 nicht mehr sinnvoll, da uniqueIdentifier ist nicht mehr verfügbar, und die Abfrage der MAC-Adresse liefert jetzt immer 02:00:00:00:00:00:00

57voto

ytur Punkte 1222

Sehen Sie sich das an,

können wir Keychain anstelle von NSUserDefaults Klasse, zum Speichern von UUID erstellt von CFUUIDCreate .

Auf diese Weise konnten wir vermeiden, dass für UUID Wiederherstellung mit Neuinstallation, und erhalten immer dasselbe UUID für dieselbe Anwendung sogar Benutzer deinstallieren und wieder neu installieren.

UUID wird nur neu erstellt, wenn das Gerät vom Benutzer zurückgesetzt wird.

Ich habe diese Methode mit SFHFKeychainUtils und es funktioniert wie ein Zauber.

48voto

Samir Jwarchan Punkte 1047

Erstellen Sie Ihre eigene UUID und speichern Sie sie dann im Schlüsselbund. So bleibt sie erhalten, auch wenn Ihre App deinstalliert wird. In vielen Fällen bleibt sie auch dann erhalten, wenn der Benutzer zwischen Geräten wechselt (z. B. vollständige Sicherung und Wiederherstellung auf einem anderen Gerät).

Sie wird damit zu einem einzigartigen Benutzerkennwort soweit es Sie betrifft. (sogar besser als Gerät Bezeichner).

Ejemplo:

Ich definiere eine benutzerdefinierte Methode zur Erstellung einer UUID als:

- (NSString *)createNewUUID 
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

Sie können sie dann in KEYCHAIN beim allerersten Start Ihrer App. So können wir sie nach dem ersten Start einfach aus dem Schlüsselbund verwenden und müssen sie nicht neu generieren. Der Hauptgrund für die Verwendung des Schlüsselbundes zum Speichern ist: Wenn Sie die UUID in den Schlüsselbund gespeichert hat, bleibt sie auch dann erhalten, wenn der Benutzer die App vollständig deinstalliert und dann erneut installiert. . Dies ist also die dauerhafte Art der Speicherung, was bedeutet, dass der Schlüssel immer eindeutig ist.

     #import "SSKeychain.h"
     #import <Security/Security.h>

Fügen Sie beim Start der Anwendung den folgenden Code ein:

 // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

Laden Sie die Dateien SSKeychain.m und .h von sskeychain und ziehen Sie die Dateien SSKeychain.m und .h in Ihr Projekt und fügen Sie "Security.framework" zu Ihrem Projekt hinzu. Um anschließend UUID zu verwenden, verwenden Sie einfach :

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X