Comment créer un GUID / UUID à l'aide d'iOS

207

Je veux pouvoir créer un GUID / UUID sur l'iPhone et l'iPad.

L'intention est de pouvoir créer des clés pour des données distribuées qui sont toutes uniques. Existe-t-il un moyen de le faire avec le SDK iOS?

rustyshelf
la source
3
Il y a un article sur la façon de vous assurer de ne jamais perdre cet UUID généré, même pour iOS 5 et versions ultérieures à l'aide de KeyChain. blog.onliquid.com/…
jasoares

Réponses:

323
[[UIDevice currentDevice] uniqueIdentifier]

Renvoie l'ID unique de votre iPhone.

EDIT: -[UIDevice uniqueIdentifier]est désormais obsolète et les applications sont rejetées de l'App Store pour son utilisation. La méthode ci-dessous est désormais l'approche privilégiée.

Si vous devez créer plusieurs UUID, utilisez simplement cette méthode (avec ARC):

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

EDIT: 29 janvier 2014: si vous ciblez iOS 6 ou une version ultérieure, vous pouvez désormais utiliser la méthode beaucoup plus simple:

NSString *UUID = [[NSUUID UUID] UUIDString];
Stephan Burlot
la source
21
[[UIDevice currentDevice] uniqueIdentifier] est obsolète depuis iOS 5, et Apple rejette désormais les applications qui l'utilisent (depuis mars 2012). Le reste de la réponse est toujours précis.
Gorm
13
Après avoir été autour de cette question pendant un certain temps, je suis presque sûr que la question d'origine ne portait pas sur l'identifiant unique de l'appareil, mais sur l'obtention d'un identifiant unique général utile pour quelque chose.
Ryan McCuaig
12
Pour rendre cet ARC compatible, vous devez convertir l'objet chaîne et supprimer l'appel à libération automatique. En d'autres termes, ajoutez le transtypage: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange
65
Depuis iOS 6, vous pouvez utiliser: NSString * UUID = [[NSUUID UUID] UUIDString];
symétrique
1
Si j'utilise [[NSUUID UUID] UUIDString]; dans iOS7 et supérieur, mon application ne sera-t-elle pas rejetée par Apple?
Whoami
100

Voici le code simple que j'utilise, conforme à ARC.

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

    return uuidString;
}
trillions
la source
35
Honnêtement, cela devrait être la réponse acceptée, la question d'origine demandée pour un générateur GUID ou UUID, et tout le monde a répondu comment obtenir l'UDID du téléphone. Un identificateur universel unique (UUID) et un identifiant unique de périphérique (UDID) ne sont pas la même chose.
Joe
1
voici une ligne droite NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel
89

Dans iOS 6, vous pouvez facilement utiliser:

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

Plus de détails dans les documentations d'Apple

Arian Sharifian
la source
5
C'est de loin la solution la plus simple. Si vous n'avez pas à prendre en charge avant iOS 6, utilisez-le. J'utilisais des identifiants permanents générés par les données de base, mais c'est beaucoup mieux. +1
Sean
Parfait, merci pour ça! Ceci est ma réponse +1 pour la journée :)
justinhartman
Cela change à chaque fois que je lance l'application dans le simulateur.
Gajendra K Chauhan
46

En examinant la documentation Apple Developer, j'ai trouvé que l' objet CFUUID est disponible sur l'iPhone OS 2.0 et versions ultérieures.

Henk
la source
23

Dans Swift :

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")
Roi-sorcier
la source
22

La technique la plus simple est d'utiliser NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Voir la référence de classe NSProcessInfo .

Ryan McCuaig
la source
8
Cela renvoie un identifiant unique pour le processus. Il n'a aucune ressemblance avec un GUID. D'après les documents: "L'ID comprend le nom d'hôte, l'ID de processus et un horodatage, ce qui garantit que l'ID est unique pour le réseau"
Matt Spradley
Tu pourrais avoir raison. C'est une doublure pragmatique, et n'est probablement pas aussi à l'épreuve des balles que CFUUID. Quiconque a besoin d'une plus grande rigueur doit se rendre à CoreFoundation.
Ryan McCuaig
15

Dans Swift 3.0

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

J'ai téléchargé mon implémentation simple mais rapide d'une classe Guid pour ObjC ici: obj-c GUID

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

Il peut également analyser différents formats de chaîne.

tumtumtum
la source