如何唯一识别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 的加密值并将其与请求中收到的加密值匹配.这样做的目的是确保没有人可以侵入您的服务器,因为除了应用程序之外,任何人都看不到令牌(您甚至可以以加密格式存储令牌,以提高安全级别)。
每当向服务器发送请求时,都会将存储在设备上@987654323@ 中的 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设备的主要内容,如果未能解决你的问题,请参考以下文章