对于将图像提交到服务器的 iPhone 应用程序,我需要以某种方式将来自特定手机的所有图像绑定在一起。每次提交时,我都想发送一些唯一的电话号码。看着
[[UIDevice mainDevice] 唯一标识符]
和 [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]
但在模拟器中出现错误。
是否有苹果认可的方式来做到这一点?
对于将图像提交到服务器的 iPhone 应用程序,我需要以某种方式将来自特定手机的所有图像绑定在一起。每次提交时,我都想发送一些唯一的电话号码。看着
[[UIDevice mainDevice] 唯一标识符]
和 [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]
但在模拟器中出现错误。
是否有苹果认可的方式来做到这一点?
你得到什么错误?[[UIDevice currentDevice] uniqueIdentifier]
(已编辑以修复 API,感谢 Martin!)是官方推荐的这样做方式。
您还可以使用 CFUUID 生成 UUID。这是一些代码:
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
[uuid autorelease];
CFRelease(theUUID);
}
到目前为止,获取唯一标识符最简单、最合适的方法是使用 Apple 明确提供的机制来获取 - [[UIDevice currentDevice] uniqueIdentifier]
。您不能保证电话号码对于设备是唯一的,或者设备甚至会有电话号码。除此之外,这样做是一个可怕的想法,因为它肯定是对用户隐私的侵犯。uniqueidentifier
如果您要以任何方式存储它,甚至应该对它进行哈希处理。
为了保持您在安装之间创建的唯一标识符,您可以使用 Keychain Made easy with SSKeychain:只需按如下方式设置您的 UUID:
[SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];
然后在需要时再次调用它:
NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];
注意: 服务和帐户必须完全匹配。
然后,如果应用程序被删除并重新安装,UUID 将在重新安装时保持不变。
如果您想跨设备共享此 UUID,请将您的应用设置为使用 iCloud。然后,您可以将 UUID 存储在 NSUserDefaults 中,与 KeyValueStore 同步,然后使用上面的代码在新设备钥匙串中设置 UUID。
如果我为以上所有内容键入代码,这个答案会变得非常长,但这里有大量示例代码可以解决所有问题。
不要忘记在 iOS 5 中 uniqueIdentifier 将被弃用,你应该使用 CFUUID 而不是那个
有趣的是,Apple 已经弃用了 iOS 5 中的 uniqueIdentifier(如 gN0Me 所述)。这是相关的 TechCrunch 文章: http ://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/
Apple 建议您不再唯一标识设备,而是标识用户。在大多数情况下,这是一个很好的建议,尽管在某些情况下仍需要全局唯一的设备 ID。这些场景在广告中很常见。因此,我编写了一个非常简单的插件库,它准确地复制了现有的行为。
在一个无耻的自我推销中,我将它链接在这里,希望有人觉得它有用。另外,我欢迎所有和任何反馈/批评: http: //www.binpress.com/app/myid/591
不过,在您的特定情况下,我建议您跳过我的库提供的全局唯一 ID 功能,因为这对您的情况来说有点过分了。相反,我会生成一个简单的 CFUUID 并将其存储在 NSUserDefaults 中。此 ID 将特定于您的应用程序,但允许您在数据库中对“应用程序安装”的所有照片进行分组。
换句话说,通过弃用 uniqueIdentifier 方法,Apple 建议您不要识别每个设备,而是每个应用安装。除非您在特定条件下操作,否则每个应用ID 很可能更适合您的产品。
这是一个有趣的问题,我也在寻求解决。这是我想解决的一个场景。
当您将手机卖给另一个人时会发生什么......然后该设备 ID 将属于其他人,因此即使该应用程序从 iPhone 中删除,它也可以重新添加,然后所有这些数据都将重新关联给新用户...这很糟糕。
使用带有设备 ID MD5 的电话号码将是一个很好的解决方案。我们想出的另一个方法是拥有一个 SQL Lite DB,其中包含一些使用设备 ID 散列的令牌。然后,当应用程序被删除时,数据库被杀死并且所有数据都被取消关联。我认为这可能太脆弱了。
还有其他想法吗?
Rob Ellis (PhoneGap/Nitobi)
使用 Apple 的 GenericKeyChain 是最好的解决方案。这是工作示例>> https://developer.apple.com/library/prerelease/ios/samplecode/GenericKeychain/Introduction/Intro.html
了解 KeyChainAccess >> https://developer.apple.com/library/mac/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html#//apple_ref/doc/uid/TP30000897-CH204-TP9
还没有完成 iphone 的工作,但是如何对手机独有的东西进行哈希处理......哦,说电话号码?
片段:
NSString *phoneNumber = (NSString *) [[NSUserDefaults standardUserDefaults] objectForKey:@"SBFormattedPhoneNumber"]; // Will return null in simulator!
NSLog(@"Formatted phone number [%@]", phoneNumber);
我 [最近] 在 OS 2.2.1 [和 OS 3.0] 上按原样运行此代码。
它在设备上运行时按预期工作,并返回我的电话号码以及完整的国际拨号代码 [在我的情况下为 1]。
在模拟器上运行时,值 [returned] 是一个空字符串,因此它只适用于实际的 iPhone 设备。
我没有在 iPod Touch 上测试它。
...
本周在不同的设备上运行此代码,并得到一个空值而不是数字。
经过进一步研究,此代码片段返回的数字似乎是在 iTunes 中为设备设置的数字。
如果您在设备激活时没有在 iTunes 中输入 iPhone 的号码,或者可能(在我的情况下)如果默认值不是 iPhone 的号码并且您仍然单击“确定”,这样 iTunes 不会列出电话号码您的 iPhone 已插入,此代码将返回一个空字符串。
[以上是我最近在http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/上发布的另一篇关于此主题的文章的评论串联]
以下是有关从 iTunes 获取它的方法的更多信息,这可能对测试有用。
我用这样的代码取得了成功:
- (NSString *)stringUniqueID {
NSString * result;
CFUUIDRef uuid;
CFStringRef uuidStr;
uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
uuidStr = CFUUIDCreateString(NULL, uuid);
assert(uuidStr != NULL);
result = [NSString stringWithFormat:@"%@", uuidStr];
assert(result != nil);
NSLog(@"UNIQUE ID %@", result);
CFRelease(uuidStr);
CFRelease(uuid);
return result;
}
您可以使用 MAC 地址作为唯一 ID。以下链接将为您提供帮助