【问题标题】:how to identify ios device uniquely如何唯一识别ios设备
【发布时间】:2013-10-11 08:49:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios iphone objective-c security authentication


    【解决方案1】:

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

    advertisingTrackingEnabled

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

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

    讨论

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

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

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

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

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

    4. 每当向服务器发送请求时,都会将存储在设备上@9​​87654323@ 中的 IDFA 值与当前 IDFA 进行比较。

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

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

    确认一下,token 到 IDFA 的映射是多对一的。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      - (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 与哪个用户相关联..

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

      【讨论】:

      • 我会假设如果用户重新安装应用程序会创建一个新的 UUID?
      • 这听起来没什么用。如果 ID 可以更改,信用卡公司之类的人将如何将欺诈活动追溯到设备?
      • @Sinaesthetic 这不是这个解决方案的范围,我不确定你的意思,但是有十亿种方法可以跟踪手机上的活动,它只是不向 3rd 方开发人员开放,我猜猜它只能通过苹果或 NSA 访问;),但如果你指的是设备的 UDID,那永远不会改变!
      • 金融应用程序需要能够唯一地识别设备并将该信息发送到处理器(例如万事达卡)。 Apple 使 UUID 无法访问,并且如果用户卸载并重新安装应用程序,他们提供的 ApplicationID 替代方案可能会发生变化,就像应用程序生成自己的代码一样——所以它并没有真正识别任何设备,是吗?我不是好斗,我也只是想解决这个问题。
      • @Sinaesthetic 我理解你的意思,但他们不仅仅依赖设备信息作为识别用户的唯一方式,记住他们必须在安装时注册设备,这链接当前生成的 UDID到他们的用户名/帐户,如果用户重新安装应用程序,他们仍然需要重新注册并将新生成的 UDID 链​​接到新帐户,并且在他们的内部日志中,他们仍然会拥有该客户拥有的所有 UDID 的所有交易历史曾经使用过.. 希望能回答您的问题?
      【解决方案3】:

      您应该使用创建 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 2014-04-05
        相关资源
        最近更新 更多