Como criar um GUID / UUID usando o iOS

207

Quero poder criar um GUID / UUID no iPhone e iPad.

A intenção é poder criar chaves para dados distribuídos todos únicos. Existe uma maneira de fazer isso com o SDK do iOS?

enferrujado
fonte
3
Há um artigo sobre como garantir que você nunca perca o UUID gerado, mesmo para o iOS 5 e posterior, usando o KeyChain. blog.onliquid.com/…
jasoares 28/05

Respostas:

323
[[UIDevice currentDevice] uniqueIdentifier]

Retorna o ID exclusivo do seu iPhone.

EDIT: -[UIDevice uniqueIdentifier]agora está obsoleto e os aplicativos estão sendo rejeitados da App Store por usá-lo. O método abaixo agora é a abordagem preferida.

Se você precisar criar vários UUID, use este método (com ARC):

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

EDIT: 29 de janeiro de 2014: se você estiver segmentando o iOS 6 ou posterior, agora poderá usar o método muito mais simples:

NSString *UUID = [[NSUUID UUID] UUIDString];
Stephan Burlot
fonte
21
O [[UIDevice currentDevice] uniqueIdentifier] foi descontinuado a partir do iOS 5, e a Apple agora está rejeitando aplicativos que o utilizam (em março de 2012). O restante da resposta ainda é preciso.
Gorm 28/03
13
Tendo discutido essa questão há algum tempo, tenho certeza de que a pergunta original não era sobre o identificador exclusivo do dispositivo, mas sobre apenas obter um identificador exclusivo geral útil para algo.
Ryan McCuaig
12
Para tornar esse ARC compatível, você deve converter o objeto string e remover a chamada de liberação automática. Em outras palavras, adicione o elenco: NSString * string = (__bridge_transfer NSString *) CFUUIDCreateString (NULL, theUUID);
Paul de Lange
65
No iOS 6, você pode usar: NSString * UUID = [[NSUUID UUID] UUIDString];
Simétrica
1
Se eu usar [[NSUUID UUID] UUIDString]; no iOS7 e superior, meu aplicativo não será rejeitado pela Apple?
Whoami
100

Aqui está o código simples que estou usando, compatível com o ARC.

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

    return uuidString;
}
trilhões
fonte
35
Honestamente, essa deve ser a resposta aceita, a pergunta original solicitou um gerador de GUID ou UUID e todos responderam como obter o UDID do telefone. Um identificador universalmente único (UUID) e um identificador de dispositivo exclusivo (UDID) não são a mesma coisa.
Joe
1
aqui está uma linha reta: NSString * UUID = [[NSUUID UUID] UUIDString];
Adeel
89

No iOS 6, você pode usar facilmente:

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

Mais detalhes em Documentações da Apple

Arian Sharifian
fonte
5
Esta é de longe a solução mais simples. Se você não precisar oferecer suporte antes do iOS 6, use isso. Eu estava usando IDs permanentes gerados por dados principais, mas isso é muito melhor. +1
Sean
Perfeito, obrigado por isso! Esta é a minha resposta de +1 para o dia :) #
30613 justinhartman
Ele muda toda vez que executo o aplicativo no simulador.
Gajendra K Chauhan
46

Revendo a documentação do desenvolvedor da Apple, descobri que o objeto CFUUID está disponível no iPhone OS 2.0 e posterior.

Henk
fonte
23

Em Swift :

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")
O rei da bruxaria
fonte
22

A técnica mais simples é usar NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]. Consulte a referência de classe NSProcessInfo .

Ryan McCuaig
fonte
8
Isso retorna um identificador exclusivo para o processo. Não tem semelhança com um GUID. Dos documentos: "O ID inclui o nome do host, o ID do processo e um registro de data e hora, o que garante que o ID seja exclusivo para a rede"
Matt Spradley
Você pode estar certo. É uma linha pragmática e provavelmente não é tão à prova de balas quanto o CFUUID. Quem precisa de maior rigor deve recorrer ao CoreFoundation.
Ryan McCuaig
15

No Swift 3.0

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

Fiz upload da minha implementação simples, mas rápida, de uma classe Guid para ObjC aqui: obj-c GUID

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

Ele também pode analisar de e para vários formatos de string.

tumtumtum
fonte