如何在iOS中创建GUID/UUID

213

我想在iPhone和iPad上创建GUID/UUID。

目的是为了创建唯一的分布式数据密钥,是否有使用iOS SDK来完成这个任务的方法?


3
有一篇关于如何确保生成的UUID不丢失的文章,即使在iOS 5及以后版本中也可以使用KeyChain实现。链接为:https://blog.onliquid.com/persistent-device-unique-identifier-ios-keychain/ - jasoares
8个回答

325
[[UIDevice currentDevice] uniqueIdentifier]

返回您的 iPhone 的唯一标识符。

编辑:-[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
自iOS 5以来,[[UIDevice currentDevice] uniqueIdentifier]已被弃用,并且苹果现在拒绝使用它的应用程序(截至2012年3月)。响应的其余部分仍然准确。 - Gorm
13
我对这个问题有一段时间的了解,我非常确定最初的问题并不是关于设备的唯一标识符,而是关于获取某个东西的有用的普通唯一标识符。 - Ryan McCuaig
12
要使此代码符合 ARC,您需要将字符串对象进行类型转换并删除自动释放调用。换句话说,添加类型转换:NSString* string = (__bridge_transfer NSString*)CFUUIDCreateString(NULL, theUUID); - Paul de Lange
66
从iOS 6开始,可以使用以下代码获取UUID:NSString *UUID = [[NSUUID UUID] UUIDString]; - Symmetric
1
如果我在iOS7及以上版本中使用[[NSUUID UUID] UUIDString];,我的应用会被苹果拒绝吗? - Whoami
显示剩余7条评论

101

这里是我正在使用的简单代码,符合ARC。

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

    return uuidString;
}

36
说实话,这个答案应该被接受。原问题是要求一个GUID或UUID生成器,但每个人都回答如何获取手机的UDID。通用唯一标识符(UUID)和唯一设备标识符(UDID)不是同一种东西。 - Joe
1
这是一行直接的代码: NSString *UUID = [[NSUUID UUID] UUIDString]; - Adeel

93

iOS 6 中,你可以轻松地使用:

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

请参阅苹果文档获取更多详细信息。


5
迄今为止,这是最简单的解决方案。如果您不必支持 iOS 6 之前的版本,请使用此方法。我曾经使用核心数据生成的永久性 ID,但这种方法更好。+1 - Sean
太好了,谢谢你!这是我今天的+1答案 :) - justinhartman
每次在模拟器中运行应用程序时,它都会发生变化。 - Gajendra K Chauhan

46

研究苹果开发者文档后,我发现iPhone OS 2.0及更高版本支持使用CFUUID对象。


24

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。 - Ryan McCuaig

20

Swift 3.0

var uuid = UUID().uuidString

7

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

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

它能够解析各种字符串格式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接