31

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

  [[UIDevice mainDevice] 唯一标识符]
和 [[NSUserDefaults standardDefaults] stringForKey:@"SBFormattedPhoneNumber"]

但在模拟器中出现错误。

是否有苹果认可的方式来做到这一点?

4

13 回答 13

41

你得到什么错误?[[UIDevice currentDevice] uniqueIdentifier]已编辑以修复 API,感谢 Martin!)是官方推荐的这样做方式。

于 2008-10-22T21:44:49.437 回答
18

您还可以使用 CFUUID 生成 UUID。这是一些代码:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}
于 2008-10-23T01:41:49.707 回答
13

到目前为止,获取唯一标识符最简单、最合适的方法是使用 Apple 明确提供的机制来获取 - [[UIDevice currentDevice] uniqueIdentifier]。您不能保证电话号码对于设备是唯一的,或者设备甚至会有电话号码。除此之外,这样做是一个可怕的想法,因为它肯定是对用户隐私的侵犯。uniqueidentifier如果您要以任何方式存储它,甚至应该对它进行哈希处理。

于 2008-11-04T03:21:24.933 回答
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。

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

于 2011-12-30T07:04:08.510 回答
7

不要忘记在 iOS 5 中 uniqueIdentifier 将被弃用,你应该使用 CFUUID 而不是那个

于 2011-08-22T05:55:49.583 回答
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 将特定于您的应用程序,但允许您在数据库中对“应用程序安装”的所有照片进行分组。

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

于 2011-10-11T03:13:41.577 回答
2

这是一个有趣的问题,我也在寻求解决。这是我想解决的一个场景。

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

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

还有其他想法吗?

Rob Ellis (PhoneGap/Nitobi)

于 2009-01-26T21:05:48.567 回答
0

还没有完成 iphone 的工作,但是如何对手机独有的东西进行哈希处理......哦,说电话号码?

获取iphone号码

于 2008-10-22T21:25:12.063 回答
0

片段:

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/上发布的另一篇关于此主题的文章的评论串联]

于 2009-06-26T14:33:20.493 回答
0

以下是有关从 iTunes 获取它的方法的更多信息,这可能对测试有用。

于 2009-07-01T15:21:26.217 回答
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;
}    
于 2009-07-24T14:54:48.743 回答
0

您可以使用 MAC 地址作为唯一 ID。以下链接将为您提供帮助

如何以编程方式获取 iphone 的 MAC 地址

于 2012-09-03T07:49:11.287 回答