iPhone应用程序的唯一标识符

时间:2008-10-22 21:20:53

标签: iphone ios-simulator

对于将图像提交到服务器的iPhone应用程序,我需要以某种方式将特定手机中的所有图像绑定在一起。每次提交我都想发送一些独特的手机ID。看着

  [[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

但在模拟器中出错。

是否有Apple认可的方式?

13 个答案:

答案 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)

答案 8 :(得分:0)

没有完成iphone的工作,但如果要对手机中的一些独特内容进行操作...哦,说出电话号码?

Getting iphone number

答案 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。以下链接将帮助您

How can I programmatically get the MAC address of an iphone