对于一个将图像提交到服务器的iPhone应用程序,我需要以某种方式将同一手机的所有图像联系在一起。每次提交时,我希望发送一些唯一的手机标识符。查看了
[[UIDevice mainDevice] uniqueIdentifier]
和[[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]但在模拟器中出现错误。是否有一种经过苹果授权的方法可以实现这个功能?
对于一个将图像提交到服务器的iPhone应用程序,我需要以某种方式将同一手机的所有图像联系在一起。每次提交时,我希望发送一些唯一的手机标识符。查看了
[[UIDevice mainDevice] uniqueIdentifier]
和[[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);
}
目前获得唯一标识符的最简单、最适当的方法是使用苹果明确提供的机制来获取一个 - [[UIDevice currentDevice] uniqueIdentifier]
。您不能保证电话号码在设备上是唯一的,或者设备是否具有电话号码。此外,这样做是一种可怕的想法,因为它绝对会侵犯用户的隐私。即使是uniqueidentifier
如果您要以任何方式存储它,也应该进行哈希处理。
[SSKeychain setPassword:@"Your UUID" forService:@"com.yourapp.yourcompany" account:@"user"];
然后在需要时随时再次调用:
NSString *retrieveuuid = [SSKeychain passwordForService:@"com.yourapp.yourcompany" account:@"user"];
请不要忘记,在iOS 5中,uniqueIdentifier将被弃用,应该使用CFUUID来替代它。
这是一个我也在研究解决的有趣问题。以下是我想要解决的情景。
当你将手机卖给另一个人时会发生什么......那个设备ID将属于其他人,因此即使从iPhone中删除了应用程序,它也可以被重新添加,并且所有数据将重新关联到新用户......这很糟糕。
使用电话号码和设备ID MD5将是一个很好的解决方案。我们提出的另一个解决方案是使用带有一些令牌散列的SQL Lite DB与设备ID进行哈希处理。然后,当应用程序被删除时,DB将被清除,所有数据将被取消关联。我认为这可能太脆弱了。
还有其他的想法吗?
Rob Ellis(PhoneGap / Nitobi)
我用这段代码取得了成功:
- (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;
}
片段:
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]。
当在模拟器上运行时,返回的值是一个空字符串,因此只能在实际的iPhone设备上使用。
我没有在iPod Touch上测试过它。
...
本周在不同的设备上运行此代码,结果得到了一个空值而非数字。
进一步研究后发现,此代码片段返回的数字是在iTunes中为该设备设置的数字。
如果您在设备激活时没有在iTunes中输入iPhone的号码,或者(如我的情况)如果默认值不是iPhone的号码并且您仍然点击了“确定”,以致于当您的iPhone插入时iTunes不会列出电话号码,则此代码将返回一个空字符串。
[以上是我最近在{{link1:http://www.alexcurylo.com/blog/2008/11/15/snippet-phone-number/]另一篇文章的评论编辑串联]