如何获取一个NSUUID?
如何获取一个NSUUID?
可能是重复问题:iOS唯一用户标识符
对于我的应用程序,我需要手机的uuid。
我知道可以使用以下代码获取它:
NSUUID *uuid = [NSUUID UUID];
但是每次重新启动应用程序时,我都会收到不同的值。所以我不能像以前的uuid那样使用它(始终相同)。
有什么办法可以获得一个稳定且唯一的标识符?
如何获取唯一的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库,并通过粘贴板实现。解决方法是在第一个应用中将值写入粘贴板,然后在第二个应用中读取该值。
如何获取只有一个NSUUID?
问题出现的原因:
在App Store上,UDID(不是UUID)已经被弃用,不再被允许使用。
解决方法:
有一种模拟UDID的技术可供使用,具体方法如下:
https://stackoverflow.com/a/8677177/832111
感谢您的解释,现在我知道为什么我一直对UDID和UUID感到困惑了。还要感谢您提供的链接 🙂
问题出现的原因:
由于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的问题。