So erstellen Sie eine GUID / UUID mit iOS

207

Ich möchte eine GUID / UUID auf dem iPhone und iPad erstellen können.

Ziel ist es, Schlüssel für verteilte Daten erstellen zu können, die alle eindeutig sind. Gibt es eine Möglichkeit, dies mit dem iOS SDK zu tun?

rostig
quelle
3
Es gibt einen Artikel darüber, wie Sie sicherstellen können, dass Sie diese generierte UUID auch für iOS 5 und höher mit KeyChain nie verlieren. blog.onliquid.com/…
jasoares

Antworten:

323
[[UIDevice currentDevice] uniqueIdentifier]

Gibt die eindeutige ID Ihres iPhones zurück.

BEARBEITEN: -[UIDevice uniqueIdentifier]ist jetzt veraltet und Apps werden aus dem App Store für die Verwendung abgelehnt. Die folgende Methode ist nun der bevorzugte Ansatz.

Wenn Sie mehrere UUIDs erstellen müssen, verwenden Sie einfach diese Methode (mit ARC):

+ (NSString *)GetUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  return (__bridge NSString *)string;
}

BEARBEITEN: 29. Januar 2014: Wenn Sie auf iOS 6 oder höher abzielen, können Sie jetzt die viel einfachere Methode verwenden:

NSString *UUID = [[NSUUID UUID] UUIDString];
Stephan Burlot
quelle
21
[[UIDevice currentDevice] uniqueIdentifier] ist ab iOS 5 veraltet, und Apple lehnt jetzt Apps ab, die es verwenden (Stand März 2012). Der Rest der Antwort ist immer noch korrekt.
Gorm
13
Nachdem ich mich eine Weile mit dieser Frage befasst habe, bin ich mir ziemlich sicher, dass es bei der ursprünglichen Frage nicht um die eindeutige Kennung des Geräts ging, sondern nur darum, eine nützliche allgemeine eindeutige Kennung für etwas zu erhalten.
Ryan McCuaig
12
Um diese ARC-Kompatibilität zu gewährleisten, müssen Sie das Zeichenfolgenobjekt umwandeln und den Autorelease-Aufruf entfernen. Mit anderen Worten, fügen Sie die Besetzung hinzu: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange
65
Ab iOS 6 können Sie Folgendes verwenden: NSString * UUID = [[NSUUID UUID] UUIDString];
Symmetrisch
1
Wenn ich [[NSUUID UUID] UUIDString] benutze; Wird meine App in iOS7 und höher nicht von Apple abgelehnt?
Whoami
100

Hier ist der einfache Code, den ich verwende und der mit ARC kompatibel ist.

+(NSString *)getUUID
{
    CFUUIDRef newUniqueId = CFUUIDCreate(kCFAllocatorDefault);
    NSString * uuidString = (__bridge_transfer NSString*)CFUUIDCreateString(kCFAllocatorDefault, newUniqueId);
    CFRelease(newUniqueId);

    return uuidString;
}
Billionen
quelle
35
Ehrlich gesagt sollte dies die akzeptierte Antwort sein, die ursprüngliche Frage, die nach einer GUID oder einem UUID-Generator gestellt wurde, und jeder antwortete, wie man die UDID des Telefons erhält. Eine universell eindeutige Kennung (UUID) und eine eindeutige Gerätekennung (UDID) sind nicht dasselbe.
Joe
1
hier ist eine gerade Linie eins NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel
89

In iOS 6 können Sie einfach verwenden:

NSUUID  *UUID = [NSUUID UUID];
NSString* stringUUID = [UUID UUIDString];

Weitere Details finden Sie in den Apple-Dokumentationen

Arian Sharifian
quelle
5
Dies ist bei weitem die einfachste Lösung. Wenn Sie vor iOS 6 keine Unterstützung benötigen, verwenden Sie diese Option. Ich habe mit Kerndaten generierte permanente IDs verwendet, aber das ist viel besser. +1
Sean
Perfekt, danke dafür! Dies ist meine +1 Antwort für den Tag :)
Justinhartman
Es ändert sich jedes Mal, wenn ich eine App im Simulator starte.
Gajendra K Chauhan
46

Beim Überprüfen der Apple Developer-Dokumentation stellte ich fest, dass das CFUUID- Objekt auf dem iPhone OS 2.0 und höher verfügbar ist.

Henk
quelle
23

In Swift :

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")
König-Zauberer
quelle
22

Die einfachste Technik ist zu verwenden NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Siehe die NSProcessInfo- Klassenreferenz.

Ryan McCuaig
quelle
8
Dies gibt eine eindeutige Kennung für den Prozess zurück. Es hat keine Ähnlichkeit mit einer GUID. Aus den Dokumenten: "Die ID enthält den Hostnamen, die Prozess-ID und einen Zeitstempel, der sicherstellt, dass die ID für das Netzwerk eindeutig ist"
Matt Spradley
Da könntest du recht haben. Es ist ein pragmatischer Einzeiler und wahrscheinlich nicht so kugelsicher wie CFUUID. Jeder, der die größere Genauigkeit benötigt, sollte sich an CoreFoundation wenden.
Ryan McCuaig
15

In Swift 3.0

var uuid = UUID().uuidString
Radu Diță
quelle
7

Ich habe meine einfache, aber schnelle Implementierung einer Guid-Klasse für ObjC hier hochgeladen : obj-c GUID

Guid* guid = [Guid randomGuid];
NSLog("%@", guid.description);

Es kann auch zu und von verschiedenen Zeichenfolgenformaten analysiert werden.

tumtumtum
quelle