iPhone应用程序的唯一标识符

iPhone应用程序的唯一标识符,iphone,ios-simulator,Iphone,Ios Simulator,对于向服务器提交图像的iPhone应用程序,我需要以某种方式将来自特定手机的所有图像绑定在一起。每次提交时,我都想发送一些独特的电话号码。查看 [[UIDevice mainDevice] uniqueIdentifier] and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"] [[UIDevice mainDevice]唯一标识符] 和 [[NSUserDefaults standard

对于向服务器提交图像的iPhone应用程序,我需要以某种方式将来自特定手机的所有图像绑定在一起。每次提交时,我都想发送一些独特的电话号码。查看 [[UIDevice mainDevice] uniqueIdentifier]
and [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"] [[UIDevice mainDevice]唯一标识符]
和 [[NSUserDefaults standardDefaults]stringForKey:@“SBFormattedPhoneNumber”]

但是在模拟器中出现错误


有没有一种苹果认可的方法可以做到这一点?

还没有完成iphone的工作,但是我们来看看这款手机的独特之处。。。哦,说电话号码


您遇到了哪些错误<代码>[[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]
。您不能保证该电话号码对该设备是唯一的,或者该设备甚至有一个电话号码。除此之外,这样做是一个可怕的想法,因为它肯定是对用户隐私的侵犯。即使是
唯一标识符
,如果要以任何方式存储它,也应该对其进行散列。

这是一个有趣的问题,我也在研究解决这个问题。下面是我想解决的一个场景

当你把手机卖给另一个人时会发生什么。。。该设备ID将属于其他人,因此即使该应用程序从iPhone中删除,也可以重新添加,然后所有数据将重新关联到新用户。。。这很糟糕

使用设备ID为MD5的电话号码将是一个很好的解决方案。我们提出的另一个方法是使用一个SQL Lite数据库,其中包含一些用设备ID散列的令牌。然后,当删除应用程序时,数据库将被删除,所有数据都将被解除关联。我想那可能太脆弱了

还有其他想法吗

罗伯·埃利斯(电话鸿沟/尼托比)

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在我的情况下]

当在模拟器上运行时,[返回的]值是一个空字符串,因此它只在实际的iPhone设备上工作

我没有在iPodtouch上测试它

本周在另一台设备上运行此代码,得到的是空值而不是数字

进一步研究表明,此代码snippit返回的号码是iTunes中为该设备设置的号码

如果您在设备激活时没有在iTunes中输入iPhone的号码,或者(在我的例子中)如果默认值不是iPhone的号码,并且您仍然单击了OK,这样iTunes在插入iPhone时不会列出电话号码,则此代码将返回空字符串


[以上是我最近在另一篇关于这个主题的文章中发表的评论的编辑摘要。

是关于从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;
}    

别忘了,在iOS 5中,uniqueIdentifier将被弃用。你应该使用CFUUID而不是CFUUID。有趣的是,苹果已经弃用了iOS 5中的uniqueIdentifier(如gN0Me所述)。以下是相关的TechCrunch文章:

苹果建议你不再唯一地识别设备,而是识别用户。在大多数情况下,这是一个很好的建议,尽管在某些情况下仍然需要一个全局唯一的设备ID。这些情况在广告中很常见。因此,我写了一个非常简单的drop-In-library准确地定义现有的行为

在一个无耻的自我推销插件中,我将把它链接到这里,希望有人觉得它有用。此外,我欢迎所有和任何反馈/批评:

然而,在您的特定情况下,我建议跳过我的库提供的全局唯一ID功能,因为这对于您的情况来说有点过分。相反,我将生成一个简单的CFUUID并将其存储在NSUserDefaults中。此ID将特定于您的应用程序,但允许您对所有照片进行分组s用于数据库中的“应用程序安装”


换句话说,通过不推荐uniqueIdentifier方法,苹果建议您不要识别每个设备,而是每个应用程序安装。除非您在特定条件下运行,否则每个应用程序ID很可能更适合您的产品。

为了在安装之间保留您创建的唯一标识符,您可以ld使用钥匙链:只需按如下方式设置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


如果我为上述所有内容键入代码,这个答案将非常长,但这里有大量示例代码可以解决所有问题。

您可以使用MAC地址作为唯一id。下面的链接将帮助您


使用苹果的通用钥匙链,这是最好的解决方案。以下是工作示例>>


了解KeyChainAccess>

您可以访问序列号吗?使用[[UIDevice mainDevice]uniqueIdentifier]时出现错误,但[[UIDevice currentDevice]uniqueIdentifier]似乎有效。请参阅获取SBFormattedPhoneNumber不再有效的原因。***+[UIDevice mainDevice]:无法识别:尽管尝试过[UIDevice currentDevice]及