如何唯一识别ios设备

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

advertisingTrackingEnabled

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

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

讨论

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

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

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

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

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

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

    如果不匹配,当前的 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);

【讨论】:

以上是关于如何唯一识别ios设备的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 设备中获取唯一 ID?

如何在 iOS 7 中获取设备或 iPad 的唯一编号?

私有 API iOS iCloud 锁 + 查找我的 iPhone 状态和唯一识别设备

iOS获取设备唯一标识的8种方法

UDID是啥 如何获取iOS设备UDID

查看UDID的两种方式,连手机查看,不用Mac连接iPhone手机,获取UDID, iOS 设备的一个唯一识别码