10

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

因此,我想到了将设备uuid与令牌一起保存以进行身份​​验证+安全性。然后,我知道我不能使用 device's uuid,而是必须使用identifierForVendor可能始终提供或不提供用户或设备信息的设备。

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

4

3 回答 3

9

正如您已经知道,不允许使用设备的 UUID,但是,您可以生成自己的 UUID 并将其存储在设备的 UserDefaults 中。

使用 identifierForVendor 并非 100% 可靠,因为它仅适用于 iOS6 及更高版本,并且用户可以选择不将其提供给您,这使其成为一个糟糕的选择。

这是我前段时间从互联网上复制的一些代码,直到今天仍在使用,将尝试找到源代码并稍后更新我的答案。编辑:来源

这将在 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 与哪个用户相关联。

这只是它应该如何工作的粗略草图

于 2013-10-04T11:18:17.363 回答
2

首先,Apple 开发人员指南禁止/不鼓励使用 IDFA 来跟踪用户以显示有针对性的广告(以及其他一些事情)。该指南明确允许开发人员出于安全目的使用 IDFA 来识别设备。引用苹果指南

广告跟踪已启用

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

@property ( nonatomic , readonly, getter=isAdvertisingTrackingEnabled) BOOL adsTrackingEnabled

讨论

在执行任何广告跟踪之前检查此属性的值。如果值为 NO,则仅将广告标识符用于以下目的:频次上限、转化事件、估计唯一用户数、安全和欺诈检测以及调试。

您可以使用设备的 IDFA 来实现多设备登录。流程有点像这样:

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

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

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

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

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

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

只需确认,token 到 IDFA 的映射将是多对一的。

希望这会有所帮助,如果有任何不清楚/不满足用例的情况,请发表评论。

于 2013-12-12T11:01:08.620 回答
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);
于 2013-10-04T11:17:43.110 回答