Jak utworzyć identyfikator GUID / UUID za pomocą iOS

207

Chcę mieć możliwość utworzenia GUID / UUID na iPhonie i iPadzie.

Chodzi o to, aby móc tworzyć klucze dla rozproszonych danych, które są unikalne. Czy można to zrobić za pomocą zestawu SDK dla systemu iOS?

rustyshelf
źródło
3
Jest artykuł o tym, jak zapewnić, że nigdy nie stracisz wygenerowanego UUID, nawet dla iOS 5 i nowszych przy użyciu KeyChain. blog.onliquid.com/…
jasoares

Odpowiedzi:

323
[[UIDevice currentDevice] uniqueIdentifier]

Zwraca unikalny identyfikator telefonu iPhone.

EDYCJA: -[UIDevice uniqueIdentifier]jest już przestarzałe, a aplikacje są odrzucane z App Store za korzystanie z niej. Poniższa metoda jest teraz preferowanym podejściem.

Jeśli chcesz utworzyć kilka UUID, po prostu użyj tej metody (z ARC):

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

EDYCJA: 29 stycznia 2014: Jeśli celujesz w iOS 6 lub nowszy, możesz teraz użyć znacznie prostszej metody:

NSString *UUID = [[NSUUID UUID] UUIDString];
Stephan Burlot
źródło
21
[[UIDevice currentDevice] uniqueIdentifier] został uznany za przestarzały od iOS 5, a Apple obecnie odrzuca aplikacje, które go używają (od marca 2012). Reszta odpowiedzi jest nadal dokładna.
Gorm
13
Przez pewien czas zastanawiałem się nad tym pytaniem, jestem prawie pewien, że pierwotne pytanie nie dotyczyło unikalnego identyfikatora urządzenia, ale jedynie uzyskania użytecznego ogólnego unikalnego identyfikatora czegoś.
Ryan McCuaig,
12
Aby zapewnić zgodność z ARC, musisz rzutować obiekt ciąg i usunąć wywołanie autorelease. Innymi słowy dodaj rzut: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange
65
Od iOS 6 możesz używać: NSString * UUID = [[NSUUID UUID] UUIDString];
Symetryczny,
1
Jeśli użyję [[NSUUID UUID] UUIDString]; w iOS7 i nowszych, czy moja aplikacja nie zostanie odrzucona przez Apple?
Whoami,
100

Oto prosty kod, którego używam, zgodny z ARC.

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

    return uuidString;
}
tryliony
źródło
35
Szczerze mówiąc, powinna to być zaakceptowana odpowiedź, pierwotne pytanie dotyczyło generatora GUID lub UUID, a wszyscy odpowiedzieli, jak uzyskać identyfikator UDID telefonu. Uniwersalny unikalny identyfikator (UUID) i unikalny identyfikator urządzenia (UDID) to nie to samo.
Joe
1
tutaj jest jedna linia prosta NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel
89

W iOS 6 możesz łatwo używać:

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

Więcej szczegółów w dokumentacji Apple

Arian Sharifian
źródło
5
To zdecydowanie najprostsze rozwiązanie. Jeśli nie musisz obsługiwać wersji wcześniejszej niż iOS 6, użyj tego. Korzystałem z trwałych identyfikatorów generowanych z podstawowych danych, ale jest to znacznie lepsze. +1
Sean
Idealnie, dziękuję za to! To jest moja +1 odpowiedź na ten dzień :)
justinhartman
Zmienia się za każdym razem, gdy uruchamiam aplikację w symulatorze.
Gajendra K Chauhan
46

Przeglądając dokumentację Apple Developer, znalazłem obiekt CFUUID dostępny w systemie iPhone OS 2.0 i nowszych.

Henk
źródło
23

W Swift :

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")
King-Wizard
źródło
22

Najprostszą techniką jest użycie NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Zobacz odwołanie do klasy NSProcessInfo .

Ryan McCuaig
źródło
8
Zwraca unikalny identyfikator procesu. Nie ma podobieństwa do GUID. Z dokumentacji: „Identyfikator zawiera nazwę hosta, identyfikator procesu i znacznik czasu, co zapewnia, że ​​identyfikator jest unikalny dla sieci”
Matt Spradley
Możesz mieć racje. Jest to pragmatyczny jeden liniowiec i prawdopodobnie nie jest tak kuloodporny jak CFUUID. Każdy, kto potrzebuje większej dyscypliny, powinien przejść do CoreFoundation.
Ryan McCuaig
15

W Swift 3.0

var uuid = UUID().uuidString
Radu Diță
źródło
7

Przesłałem tutaj moją prostą, ale szybką implementację klasy Guid dla ObjC: GUID obj-c

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

Może parsować do iz różnych formatów łańcuchów.

tumtumtum
źródło