Cómo crear un GUID / UUID usando iOS

207

Quiero poder crear un GUID / UUID en el iPhone y iPad.

La intención es poder crear claves para datos distribuidos que sean únicos. ¿Hay alguna manera de hacer esto con el SDK de iOS?

rustyshelf
fuente
3
Hay un artículo sobre cómo asegurarse de que nunca pierda el UUID generado, incluso para iOS 5 y posteriores con KeyChain. blog.onliquid.com/…
jasoares

Respuestas:

323
[[UIDevice currentDevice] uniqueIdentifier]

Devuelve la ID única de tu iPhone.

EDITAR: -[UIDevice uniqueIdentifier]ahora está en desuso y las aplicaciones están siendo rechazadas de la App Store por usarlo. El siguiente método es ahora el enfoque preferido.

Si necesita crear varios UUID, simplemente use este método (con ARC):

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

EDITAR: 29 de enero de 2014: si está apuntando a iOS 6 o posterior, ahora puede usar el método mucho más simple:

NSString *UUID = [[NSUUID UUID] UUIDString];
Stephan Burlot
fuente
21
[[UIDevice currentDevice] uniqueIdentifier] ha quedado en desuso a partir de iOS 5, y Apple ahora rechaza las aplicaciones que lo usan (a partir de marzo de 2012). El resto de la respuesta sigue siendo precisa.
Gorm
13
Después de haber abordado esta pregunta durante un tiempo, estoy bastante seguro de que la pregunta original no se refería al identificador único del dispositivo, sino a obtener un identificador único general útil para algo.
Ryan McCuaig
12
Para que este ARC sea compatible, debe emitir el objeto de cadena y eliminar la llamada de liberación automática. En otras palabras, agregue el reparto: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange
65
A partir de iOS 6 puede usar: NSString * UUID = [[NSUUID UUID] UUIDString];
Simétrico
1
Si uso [[NSUUID UUID] UUIDString]; en iOS7 y superior, ¿Apple no rechazará mi aplicación?
Whoami
100

Aquí está el código simple que estoy usando, compatible con ARC.

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

    return uuidString;
}
trillones
fuente
35
Honestamente, esta debería ser la respuesta aceptada, la pregunta original pedía un generador de GUID o UUID, y todos respondieron con cómo obtener el UDID del teléfono. Un identificador único universal (UUID) y un identificador único de dispositivo (UDID) no son lo mismo.
Joe
1
aquí hay una línea recta NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel
89

En iOS 6 puedes usar fácilmente:

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

Más detalles en las Documentaciones de Apple

Arian Sharifian
fuente
55
Esta es, con mucho, la solución más simple. Si no tiene que soportar antes de iOS 6, use esto. Estaba usando ID permanentes generados por datos centrales, pero esto es mucho mejor. +1
Sean
Perfecto, gracias por esto! Esta es mi respuesta +1 para el día :)
justinhartman
Cambia cada vez que ejecuto la aplicación en el simulador.
Gajendra K Chauhan
46

Al revisar la documentación del desarrollador de Apple, encontré que el objeto CFUUID está disponible en el iPhone OS 2.0 y posterior.

Henk
fuente
23

En Swift :

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")
Rey Mago
fuente
22

La técnica más simple es usar NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Consulte la referencia de clase NSProcessInfo .

Ryan McCuaig
fuente
8
Eso devuelve un identificador único para el proceso. No tiene semejanza con un GUID. De los documentos: "La identificación incluye el nombre de host, la identificación del proceso y una marca de tiempo, lo que garantiza que la identificación sea única para la red"
Matt Spradley,
Podrías estar en lo cierto. Es una línea pragmática, y probablemente no sea tan resistente a las balas como CFUUID. Cualquiera que necesite el mayor rigor debería ir a CoreFoundation.
Ryan McCuaig
15

En Swift 3.0

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

He subido mi implementación simple pero rápida de una clase Guid para ObjC aquí: obj-c GUID

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

También puede analizar hacia y desde varios formatos de cadena.

tumtumtum
fuente