在我当前的应用程序中,我必须让用户从不同的 iOS 设备登录到他们的帐户。目前我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来做到这一点。
因此,我想到了将设备uuid
与令牌一起保存以进行身份验证+安全性。然后,我知道我不能使用 device's uuid
,而是必须使用identifierForVendor
可能始终提供或不提供用户或设备信息的设备。
那么,任何人都可以建议在 ios 中为同一用户帐户实现这种多设备登录功能的更好和正确的方法吗?
在我当前的应用程序中,我必须让用户从不同的 iOS 设备登录到他们的帐户。目前我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来做到这一点。
因此,我想到了将设备uuid
与令牌一起保存以进行身份验证+安全性。然后,我知道我不能使用 device's uuid
,而是必须使用identifierForVendor
可能始终提供或不提供用户或设备信息的设备。
那么,任何人都可以建议在 ios 中为同一用户帐户实现这种多设备登录功能的更好和正确的方法吗?
正如您已经知道,不允许使用设备的 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 与哪个用户相关联。
这只是它应该如何工作的粗略草图
首先,Apple 开发人员指南禁止/不鼓励使用 IDFA 来跟踪用户以显示有针对性的广告(以及其他一些事情)。该指南明确允许开发人员出于安全目的使用 IDFA 来识别设备。引用苹果指南
广告跟踪已启用
一个布尔值,指示用户是否有有限的广告跟踪。(只读)
@property ( nonatomic , readonly, getter=isAdvertisingTrackingEnabled) BOOL adsTrackingEnabled
讨论
在执行任何广告跟踪之前检查此属性的值。如果值为 NO,则仅将广告标识符用于以下目的:频次上限、转化事件、估计唯一用户数、安全和欺诈检测以及调试。
您可以使用设备的 IDFA 来实现多设备登录。流程有点像这样:
用户使用设备 A 登录到服务器,服务器发回一个令牌,该令牌存储在设备上NSUserDefaults
。该应用程序还将 IDFA 存储在设备上的NSUserDefaults
此令牌将用于创建包含 IDFA 的加密字符串。(使用令牌加密 IDFA)加密值将在每个请求中与原始 IDFA 一起传递给服务器。
然后,服务器将使用 IDFA 和与其关联的令牌(服务器当然会存储与每个令牌对应的 IDFA)来获取 IDFA 的加密值并将其与请求中收到的加密值匹配。这样做的目的是确保没有人可以侵入您的服务器,因为除了应用程序之外,任何人都看不到令牌(您甚至可以以加密格式存储令牌,以提高安全级别)。
每当向服务器发送请求时,将存储在设备中的 IDFA 值NSUserDefaults
与当前 IDFA 进行比较。
如果不匹配,当前的 IDFA 将首先更新到服务器,然后在获得成功更新的确认后,应用程序会将存储在设备上的 IDFA 替换为NSUserDefaults
当前的 IDFA(然后业务照常运行)。
或者,您可以避免步骤 3,4 并将 IDFA 存储在设备上,NSUserDefaults
但这样用户在重置 IDFA 时必须重新登录服务器。
只需确认,token 到 IDFA 的映射将是多对一的。
希望这会有所帮助,如果有任何不清楚/不满足用例的情况,请发表评论。
您应该使用创建 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);