如何唯一识别iOS设备

10
在我的当前应用程序中,我必须让用户从不同的iOS设备登录到他们的账户。目前我是通过令牌值进行用户验证的。但为了支持多设备登录,我必须找到另一种方法来做这件事。
因此,我想将设备uuid与令牌一起保存以进行身份验证和安全性。然后,我得知不能使用设备的uuid,而必须使用identifierForVendor,它并不总是提供用户或设备信息。
所以,有人能建议在iOS上实现同一用户账户的多设备登录功能的更好和适当的方法吗?
3个回答

9

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

使用identifierForVendor并不是100%可靠,因为它仅适用于iOS6及以上版本,并且用户有选择性地选择不提供给您,这使它成为一个糟糕的选择。

以下是我从互联网上复制过来的代码,直到今天仍在使用。稍后我会尝试找到来源并更新我的答案。 EDIT: 来源

这将为您生成并存储一个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与哪个用户相关联了。这只是一个大致的工作原理草图。

我会假设如果用户重新安装应用程序,将创建一个新的UUID? - rup3rt
这听起来并不实用。如果ID可以更改,信用卡公司如何追踪欺诈活动到设备呢? - Sinaesthetic
1
@Sinaesthetic 这不是这个解决方案的范围,我不确定你的意思,但有无数种方法可以跟踪手机上的活动,只是不向第三方开发人员开放,我猜只能通过苹果或NSA访问;但如果你指的是设备的UDID,那是永远不会改变的! - Mostafa Berg
好的,想象这样一种情况:一个设备可以通过用户名/密码支持多个用户。我是 MasterCard。有一笔看起来是欺诈交易的交易。我需要知道在哪个用户使用了哪个设备(即通道)执行了该交易。根据你所说的,我能够看到 UserA 在设备 A23423 上执行了交易,该设备也被称为设备 A99999 和 AB3243(它被重新安装了两次)。生成的设备 ID 对我意味着什么?我如何能够证明交易发生在哪个物理设备上?有什么办法防止任何人伪造该 ID 吗? - Sinaesthetic
该设备不是“也称为A99999”,它曾经被称为A99999,该设备每次只会有一个当前UDID。你的情况对我来说没有意义,实际上与UDID无关。 - Mostafa Berg
显示剩余4条评论

2
首先,苹果开发者指南禁止/不鼓励使用IDFA来追踪用户以显示定向广告(以及其他一些事情)。该指南明确允许开发者将IDFA用于安全目的下识别设备。引用苹果指南:
“advertisingTrackingEnabled”
一个布尔值,指示用户是否有限制广告跟踪。(只读)
@property(nonatomic, readonly, getter=isAdvertisingTrackingEnabled) BOOL advertisingTrackingEnabled
“Discussion”
在执行任何广告跟踪之前,请检查此属性的值。如果值为NO,则仅将广告标识符用于以下目的:频率上限、转换事件、估计独特用户数、安全和欺诈检测以及调试。
您可以使用设备的IDFA进行多设备登录。流程大致如下:
1. 用户使用设备A登录服务器,服务器返回一个令牌,该令牌存储在设备的NSUserDefaults中。应用程序还会在设备上存储IDFA。
2. 此令牌将用于创建包含IDFA的加密字符串。(使用令牌加密IDFA)加密值将随每个请求与原始IDFA一起传递到服务器。
3. 然后,服务器将使用与其关联的IDFA和令牌(服务器当然会存储与每个令牌相对应的IDFA)来获取IDFA的加密值,并将其与请求中收到的加密值进行匹配。这样做的目的是确保没有人可以侵入您的服务器,因为令牌除了应用程序之外任何人都看不到(甚至可以将令牌以加密格式存储以增加安全级别)。
4. 每当向服务器发送请求时,都会将存储在NSUserDefaults中的IDFA值与当前IDFA进行比较。
5. 如果存在不匹配,首先将当前IDFA更新到服务器,然后在获得成功更新的确认后,应用程序将用当前IDFA替换存储在NSUserDefaults中的IDFA(然后业务运行如常)。
或者,您可以避免第3、4步和在设备上存储IDFA在NSUserDefaults中,但这样用户在重置IDFA时必须重新登录服务器。
只是确认,令牌到IDFA的映射将是多对一。
希望这有所帮助,如果有任何不清楚/不满足用例的地方,请在评论中说明。

0

你应该使用标准的UUID创建方式。苹果不希望你追踪设备。

 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接