对于将图像提交到服务器的iPhone应用程序,我需要以某种方式将特定手机中的所有图像绑定在一起。每次提交我都想发送一些独特的手机ID。看着
[[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]
但在模拟器中出错。
是否有Apple认可的方式?
答案 0 :(得分:41)
你得到了什么错误? [[UIDevice currentDevice] uniqueIdentifier]
(编辑修复API,感谢Martin!)是官方推荐的方法。
答案 1 :(得分:18)
您还可以使用CFUUID生成UUID。这是一些代码:
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
[uuid autorelease];
CFRelease(theUUID);
}
答案 2 :(得分:13)
到目前为止,获取唯一标识符的最简单和最合适的方法是使用Apple明确提供的机制来获取一个 - [[UIDevice currentDevice] uniqueIdentifier]
。您不能保证电话号码对于设备是唯一的,或者设备甚至会有电话号码。除此之外,这样做是一个可怕的想法,因为它是对用户隐私的明确入侵。如果您要以任何方式存储它,即使uniqueidentifier
也应该进行哈希处理。
答案 3 :(得分:8)
为了保留您在安装之间创建的唯一标识符,您可以使用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。
如果我输入上述所有代码,这个答案会变得非常长,但是这里有大量的示例代码可以解决这个问题。
答案 4 :(得分:7)
不要忘记,在iOS 5中,uniqueIdentifier将被弃用,您应该使用CFUUID而不是
答案 5 :(得分:5)
有趣的是,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将特定于您的应用程序,但允许您将数据库中的“app install”的所有照片分组。
换句话说,通过弃用uniqueIdentifier方法,Apple建议您不识别每个设备,而是识别每个应用 install 。除非您在特定条件下运营,否则每个应用程序 ID可能更适合您的产品。
答案 6 :(得分:2)
这是一个有趣的问题,我也在考虑解决。这是我想要解决的一个场景。
当您将手机出售给其他人时会发生什么......设备ID将属于其他人,因此即使该应用程序已从iPhone中删除,也可以重新添加,然后所有数据都将被重新关联到新用户...这很糟糕。
使用带有设备ID MD5的电话号码将是一个很好的解决方案。我们提出的另一个问题是使用带有设备ID的一些令牌哈希的SQL Lite数据库。然后,当删除应用程序时,数据库将被终止,并且所有数据都将被取消关联。我认为这可能太脆弱了。
还有其他想法吗?
Rob Ellis(PhoneGap / Nitobi)
答案 7 :(得分:1)
使用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
答案 8 :(得分:0)
没有完成iphone的工作,但如果要对手机中的一些独特内容进行操作...哦,说出电话号码?
答案 9 :(得分:0)
SNIPPIT:
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]。
在模拟器上运行时,值[returns]是一个空字符串,因此它只适用于实际的iPhone设备。
我没有在iPod Touch上测试它。
...
本周在其他设备上运行此代码,并获得空值而不是数字。
在进一步研究中,此代码snippit返回的数字似乎是iTunes中为设备设置的数字。
如果您没有在设备激活时在iTunes中输入iPhone的号码,或者(如我的情况),如果默认值不是iPhone的号码,并且您仍然单击确定,那么iTunes不会列出插入iPhone时的电话号码,此代码将返回空字符串。
[以上是我最近在http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]
上发布的关于此主题的另一篇文章的编辑串联评论答案 10 :(得分:0)
Here是关于从iTunes获取内容的更多信息,可能对测试有用。
答案 11 :(得分:0)
我使用这样的代码取得了成功:
- (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;
}
答案 12 :(得分:0)
您可以将MAC地址用作唯一ID。以下链接将帮助您