在iOS 7中创建UUID和UDID

5

我想创建UUID,我有下面的代码可以创建UUID,如何在iOS7中使用多个供应商相同的ID创建UDID?

+ (NSString*) stringWithNewUUID
{
    CFUUIDRef uuidObj = CFUUIDCreate(nil);
    NSString *newUUID = (NSString*)CFUUIDCreateString(nil, uuidObj);
    CFRelease(uuidObj);
    return newUUID;
}

请问您能告诉我们为什么想要这样做吗? - ivan_yorgov
我有一些业务需求。 - Sandeep Khade
@SandeepKhade 为什么你说它包含时间戳?CFUUID文档 没有提到任何关于时间戳的内容。 - Amar
1
CFUUID是使用计算机的唯一标识符(MAC地址)和100纳秒间隔生成的,那么为什么不直接获取MAC地址并创建自己的UUID呢? - ivan_yorgov
我认为他正在提到版本 1 UUID(包括 MAC 地址和时间戳)与版本 4 UUID(随机生成)之间的区别。如果你查看 CFUUIDCreate() 的源代码,只要链接在 10.4+ 上,它应该使用 uuid_generate_random() 来生成 UUID。 - iccir
5个回答

5

这个方法可以返回iOS 6及以上版本的随机UUID。

[[UIDevice currentDevice]identifierForVendor]

谢谢Arun,我想为我的设备创建唯一标识符,而不是供应商。 - Sandeep Khade
1
这并不是它的意思。
  • identifierForVendor 相同开发者的应用之间相同的标识。
- John McKnight
1
@CrossphireDevelopment:无论供应商如何,identifierForVendor方法在不同设备上返回不同的值。苹果文档:“对于来自同一供应商并在同一设备上运行的应用程序,此属性的值相同。对于来自不同供应商的同一设备上的应用程序以及对于不同设备上的应用程序,返回不同的值。” - Armin
@ArminM我不是在提到多个设备,只是当前的设备。如果在不同设备上保持一致将毫无意义,我所说的是在同一设备上的一致性,这将使其表现得像一个UDID。 - John McKnight
1
警告:如果在安装另一个应用程序之前从设备中删除了该供应商的所有应用程序,则identifierForVendor将更改。 - Ash

5

我已经创建了一个供应商 ID 并将其保存在钥匙串中,下一次可以使用 KeychainWrapper keychainStringFromMatchingIdentifier:... 保留它。


苹果公司批准了这种方法吗? - Nam Vu
是的,如果您需要新的UUID在应用程序被删除和重新安装后仍然存在,那么该值可以存储在iOS的钥匙串中。 - Hashem Aboonajmi

5
CFUUIDCreate函数生成一个版本4的UUID,它完全采用伪随机数生成器生成。这种类型的UUID中没有嵌入时间戳或MAC地址(这是指鲜为人知的版本1),对于几乎所有应用程序来说都是安全的。

1
是的,请查看https://www.opensource.apple.com/source/CF/CF-744/CFUUID.c。从技术上讲,CFUUIDCreate()可以创建版本1的uuid,但默认情况下为版本4(在iOS 7和OS X 10.8上进行了测试)。 - iccir
1
谢谢,我想要为设备创建UDID而不是供应商ID。 - Sandeep Khade

2

上面代码生成的 UUID 没有可恢复的时间戳。它只是一个看起来像这样的字符串: E1D87006-7CD0-4E28-9768-624DA92F75D6


是的 @claireware,它是以字符串形式呈现的。 - Sandeep Khade

0
我跟随Sandeep Khade的答案,使用PDKeychainBindings创建了下面这段代码。它与使用NSUserDefaults相同,但它将标识符保存在Keychain中,即使应用程序被删除,也可以保存数据。
+ (NSString *)uniqueVendor {

    PDKeychainBindings *keychain = [PDKeychainBindings sharedKeychainBindings];
    NSString *uniqueIdentifier = [keychain objectForKey:kKeyVendor];

    if (!uniqueIdentifier || !uniqueIdentifier.length) {

        NSUUID *udid = [[UIDevice currentDevice] identifierForVendor];
        uniqueIdentifier = [udid UUIDString];
        [keychain setObject:uniqueIdentifier forKey:kKeyVendor];
    }

    return uniqueIdentifier;
}

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