如何唯一地识别ios设备

时间:2013-10-04 11:12:20

标签: ios iphone objective-c security authentication

在我目前的应用程序中,我必须让用户从不同的iOS设备登录到他们的帐户。目前我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来做到这一点。

因此,我想到了保存设备uuid以及用于身份验证+安全性的令牌。然后,我知道我无法使用设备uuid,而是必须使用identifierForVendor,它可能会或可能不会始终提供用户或设备信息。

那么,任何人都可以建议在ios中为同一个用户帐户实现这种多设备登录功能的更好和正确的方法吗?

3 个答案:

答案 0 :(得分:7)

如您所知,不允许使用设备的UUID,但您可以生成自己的UUID并将其存储在设备的UserDefaults上。

使用identifierForVendor不是100%可靠,因为它只能在iOS6及更高版本上运行,并且用户可以选择不给它,这使得它成为一个糟糕的选择。

以下是我之前复制了互联网的一些代码,直到今天仍然使用它,会尝试找到源代码并稍微更新我的答案。 编辑:Source

这将在UserDefaults中为您生成并存储UUID:

- (NSString *)createUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  [[NSUserDefaults standardUserDefaults] setObject:(__bridge NSString *)string forKey:@"UUID"];
  [[NSUSerDefaults standardUserDefaults] synchronize];
  return (__bridge NSString *)string;
}

无论什么时候需要阅读生成的UUID:

- (NSString*)UUID
{
    return [[NSUserDefaults standardUserDefaults] ObjectForKey:@"UUID"];
}

现在您可以选择将自己的用户ID附加到此处,这样您就可以知道哪个UUID链接到哪个用户..

这只是它应该如何运作的草图

答案 1 :(得分:2)

首先,Apple开发人员指南禁止/阻止使用IDFA跟踪用户以显示目标广告(以及其他一些内容)。该指南明确允许开发人员出于安全目的使用IDFA来识别设备。引用苹果指南

  

<强> advertisingTrackingEnabled

     

一个布尔值,指示用户是否具有有限的广告跟踪。 (只读)

     

@ 属性(非原子,只读,getter = isAdvertisingTrackingEnabled)BOOL advertisingTrackingEnabled

     

<强>讨论

     

在执行任何广告跟踪之前,请检查此媒体资源的价值。如果值为“否”,则仅将广告标识符用于以下目的:频次上限,转化事件,估算唯一身份用户数,安全和欺诈检测以及调试。

您可以使用设备的IDFA进行多个设备登录。流程有点像这样:

  1. 用户使用设备A登录服务器,服务器发回一个存储在NSUserDefaults设备上的令牌。该应用还会在NSUserDefaults

  2. 中将IDFA存储在设备上
  3. 此令牌将用于创建包含IDFA的加密字符串。 (使用令牌加密IDFA)加密值将与原始IDFA一起传递到每个请求中的服务器。

  4. 然后服务器将使用IDFA和与之关联的令牌(服务器当然会存储与每个令牌对应的IDFA)以获取IDFA的加密值并将其与收到的加密值进行匹配在请求中。这样做的目的是确保没有人可以入侵您的服务器,因为除了应用程序之外的任何人都看不到令牌(您甚至可以以加密格式存储令牌以提高安全级别)。 / p>

  5. 每当向服务器发送请求时,NSUserDefaults中存储在设备上的IDFA值将与当前IDFA进行比较。

  6. 如果不匹配,当前IDFA将首先更新到服务器,然后在获得成功更新确认后,应用会将NSUserDefaults中存储在设备上的IDFA替换为当前的(然后业务像往常一样运行)。

  7. 或者,您可以避免步骤3,4并在NSUserDefaults中将IDFA存储在设备上,但在此情况下,用户必须在重置IDFA时重新登录服务器。

    只需确认,令牌与IDFA的映射将是多对一的。

    希望这有帮助,在任何不清楚/不满足用例的情况下发表评论。

答案 2 :(得分:0)

您应该使用创建UUID的标准方法。 Apple不希望您跟踪设备。

 To create a unique identifier specific to your app, you can call the CFUUIDCreate function to
 create a UUID, and write it to the defaults database using the NSUserDefaults class. (Source)

如果你想使用一个库而不是自己编辑,你应该使用这个优秀的库:

CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef);
CFRelease(uuidRef);