如何使用iOS创建GUID / UUID


207

我希望能够在iPhone和iPad上创建GUID / UUID。

目的是能够为所有唯一的分布式数据创建密钥。有没有办法使用iOS SDK?


3
有一篇文章介绍了如何确保即使在iOS 5及更高版本使用KeyChain的情况下,也不会丢失生成的UUID。blog.onliquid.com/…– jasoares
2015年

Answers:


323
[[UIDevice currentDevice] uniqueIdentifier]

返回iPhone的唯一ID。

编辑:-[UIDevice uniqueIdentifier]现在已弃用,并且正在使用该应用程序从App Store拒绝。现在,以下方法是首选方法。

如果您需要创建多个UUID,只需使用此方法(使用ARC):

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

编辑:2014年1月29日:如果您的目标是iOS 6或更高版本,则现在可以使用更简单的方法:

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

21
[[UIDevice currentDevice] uniqueIdentifier]自iOS 5起已过时,Apple现在拒绝使用该应用程序的应用程序(截至2012年3月)。其余响应仍然准确。
Gorm 2012年

13
解决这个问题已经有一段时间了,我很确定原来的问题不是关于设备的唯一标识符,而是关于获取某个东西的有用的通用唯一标识符。
Ryan McCuaig

12
要使此ARC兼容,必须强制转换字符串对象并删除自动释放调用。换句话说,添加强制类型转换:NSString * string =(__bridge_transfer NSString *)CFUUIDCreateString(NULL,theUUID);
保罗·

65
从iOS 6开始,您可以使用:NSString * UUID = [[NSUUID UUID] UUIDString];
2012年

1
如果我使用[[NSUUID UUID] UUIDString]; 在iOS7及更高版本中,我的应用不会被苹果拒绝吗?
Whoami 2014年

100

这是我使用的符合ARC的简单代码。

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

    return uuidString;
}

35
坦白地说,这应该是一个可以接受的答案,最初的问题是要使用GUID或UUID生成器,并且每个人都以如何获取电话的UDID进行了响应。通用唯一标识符(UUID)和唯一设备标识符(UDID)是不同的。
2013年

1
这是一条直线NSString * UUID = [[NSUUID UUID] UUIDString];
阿德(Adeel)

89

在iOS 6中,您可以轻松使用:

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

Apple文档中的更多详细信息


5
到目前为止,这是最简单的解决方案。如果您在iOS 6之前不需要支持,请使用此功能。我使用的是核心数据生成的永久ID,但这要好得多。+1
肖恩

完美,谢谢你!这是我今天的+1答案:)
justinhartman

每次我在模拟器中运行应用时,它都会改变。
Gajendra K Chauhan

46

查阅Apple Developer文档,我发现CFUUID对象在iPhone OS 2.0和更高版本上可用。


23

Swift中

var uuid: String = NSUUID().UUIDString
println("uuid: \(uuid)")

22

最简单的技术是使用NSString *uuid = [[NSProcessInfo processInfo] globallyUniqueString]。请参阅NSProcessInfo类参考。


8
这将返回该进程的唯一标识符。它与GUID不相似。从文档中:“ ID包含主机名,进程ID和时间戳,以确保该ID对于网络是唯一的”
Matt Spradley

你可能是对的。它是实用的一线工具,可能不如CFUUID防弹。任何需要更严格要求的人都应该选择CoreFoundation。
瑞安·麦凯格


7

我在这里上传了ObjC的Guid类的简单但快速的实现:obj-c GUID

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

它也可以在各种字符串格式之间进行解析。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.