如何获取一个NSUUID?

10 浏览
0 Comments

如何获取一个NSUUID?

可能是重复问题:iOS唯一用户标识符

对于我的应用程序,我需要手机的uuid。

我知道可以使用以下代码获取它:

NSUUID  *uuid = [NSUUID UUID];

但是每次重新启动应用程序时,我都会收到不同的值。所以我不能像以前的uuid那样使用它(始终相同)。

有什么办法可以获得一个稳定且唯一的标识符?

0
0 Comments

如何获取唯一的NSUUID?

在上述内容中,提到了使用OpenUDID库来为每个设备生成唯一的UDID。该库使用了粘贴板来实现。下面是一个示例:

// 第一个应用,安装->运行->关闭->删除

UIPasteboard* board = [UIPasteboard pasteboardWithName:@"com.company.wtv" create:YES];

board.persistent=YES; // 持久化,使得写入的内容在应用关闭或被删除后仍然存在

[board setValue:@"hello" forPasteboardType:@"com.company.wtv.sharedValue"];

// 第二个应用,在第一个应用被删除后安装和运行...虽然包标识符和包种子不同(我在adhoc上测试过,没有真正发布该应用,但我认为是一样的)

NSData* result=nil;

NSString* resultStr=nil;

result =[board valueForPasteboardType:@"com.company.wtv.sharedValue"];

resultStr=[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; // 我得到了包含"hello"的resultStr

从上述内容中,可以看出获取唯一的NSUUID的原因是使用了OpenUDID库,并通过粘贴板实现。解决方法是在第一个应用中将值写入粘贴板,然后在第二个应用中读取该值。

0
0 Comments

如何获取只有一个NSUUID?

问题出现的原因:

在App Store上,UDID(不是UUID)已经被弃用,不再被允许使用。

解决方法:

有一种模拟UDID的技术可供使用,具体方法如下:

https://stackoverflow.com/a/8677177/832111

感谢您的解释,现在我知道为什么我一直对UDID和UUID感到困惑了。还要感谢您提供的链接 🙂

0
0 Comments

问题出现的原因:

由于UUID是通过计算机和时间戳生成的,每秒都会得到一个新的UUID。这使得无法获取一个稳定且唯一的ID。

解决方法:

相反,可以将接收到的ID保存在keychain或plist中,并在需要时使用它。这样可以确保获取到的ID是稳定且唯一的。

文章整理如下:

UUID是128位的值,通过将在生成它的计算机上唯一的值和表示自1582年10月15日00:00:00以来的100纳秒间隔数量的值组合在一起,使得UUID在空间和时间上都是唯一的。因此,每秒都会得到一个新的UUID。

然而,由于UUID是动态生成的,无法获取一个稳定且唯一的ID。要解决这个问题,可以将接收到的ID保存在keychain或plist中,并在需要时使用它。

在iOS开发中,可以使用Keychain来存储和获取UUID。Keychain是一个安全的存储机制,可以将敏感信息加密并保存在设备上。通过将UUID存储在Keychain中,可以确保每次获取的ID都是稳定且唯一的。

以下是使用Keychain保存和获取UUID的示例代码:

// 保存UUID到Keychain
NSString *uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
NSMutableDictionary *keychainQuery = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                      (id)kSecClassGenericPassword, (id)kSecClass,
                                      @"com.example.app", (id)kSecAttrService,
                                      @"UUID", (id)kSecAttrAccount,
                                      nil];
SecItemDelete((CFDictionaryRef)keychainQuery);
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:uuid] forKey:(id)kSecValueData];
SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
// 从Keychain获取UUID
NSMutableDictionary *keychainQuery = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                      (id)kSecClassGenericPassword, (id)kSecClass,
                                      @"com.example.app", (id)kSecAttrService,
                                      @"UUID", (id)kSecAttrAccount,
                                      (id)kCFBooleanTrue, (id)kSecReturnData,
                                      nil];
CFDataRef uuidData = NULL;
if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&uuidData) == noErr) {
    uuid = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)uuidData];
    CFRelease(uuidData);
}

以上代码将UUID存储在Keychain中,并在需要时从Keychain中获取UUID。这样就可以确保每次获取的ID都是稳定且唯一的,解决了获取单个NSUUID的问题。

0