Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何唯一地识别ios设备_Ios_Iphone_Objective C_Security_Authentication - Fatal编程技术网

如何唯一地识别ios设备

如何唯一地识别ios设备,ios,iphone,objective-c,security,authentication,Ios,Iphone,Objective C,Security,Authentication,在我当前的应用程序中,我必须让用户从不同的iOS设备登录到他们的帐户。目前,我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来实现这一点 因此,我考虑将设备uuid与令牌一起保存,以实现身份验证+安全性。然后,我知道我不能使用设备的uuid,而是必须使用供应商的标识,这些标识可能会或可能不会始终提供用户或设备信息 那么,有谁能为ios中的同一用户帐户提供更好、更合适的实现多设备登录功能的方法吗?您应该使用创建UUID的标准方法。苹果不希望你使用跟踪设备 To crea

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

因此,我考虑将设备
uuid
与令牌一起保存,以实现身份验证+安全性。然后,我知道我不能使用设备的
uuid
,而是必须使用供应商的
标识,这些标识可能会或可能不会始终提供用户或设备信息


那么,有谁能为ios中的同一用户帐户提供更好、更合适的实现多设备登录功能的方法吗?

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

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

使用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附加到该ID,这样您就可以知道哪个UUID链接到哪个用户


这只是它应该如何工作的一个粗略概述

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

广告跟踪功能

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

@属性(非原子、只读、getter=isAdvertisingTrackingEnabled)BOOL advertisingTrackingEnabled

讨论

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

您可以使用设备的IDFA进行多个设备登录。流程有点像这样:

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

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

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

  • 无论何时向服务器发送请求,都会将设备上存储在
    NSUserDefaults
    中的IDFA值与当前IDFA值进行比较

  • 如果存在不匹配,将首先将当前IDFA更新到服务器,然后在获得成功更新的确认后,应用程序将使用当前IDFA替换存储在设备上的
    NSUserDefaults
    (然后正常运行)

  • 或者,您可以避免步骤3、4,并将IDFA存储在设备的
    NSUserDefaults
    中,但在这种情况下,用户必须在重置IDFA时重新登录到服务器

    仅需确认,令牌到IDFA的映射将是多对一的


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

    我假设如果用户重新安装应用程序,将创建一个新的UUID?这听起来没什么用处。如果id可以更改,人们希望信用卡公司如何将欺诈活动追溯到设备?@Sineauthm这不是此解决方案的范围,我不知道你的意思,但有十亿种方法可以在手机上跟踪活动,只是不向第三方开发者开放,我想它只能通过苹果访问,或国家安全局;),但如果你指的是设备的UDID,那永远不会改变!金融应用程序需要能够唯一地识别设备,并将该信息发送给处理器(如万事达卡)。苹果让UUID变得不可访问,如果用户卸载并重新安装应用程序,他们提供的ApplicationID替代方案可能会改变,就像应用程序生成自己的代码一样——所以它并没有真正识别任何设备,是吗?我不是好斗,我只是想解决这个问题。@我理解你的观点,但他们不仅依赖设备信息作为识别用户的唯一方式,记住他们必须在安装时注册设备,如果用户重新安装应用程序,这会将当前生成的UDID链接到他们的用户名/帐户,他们仍然需要再次注册并将新生成的UDID链接到新帐户,并且在他们的内部日志中,他们仍然拥有该客户机使用过的所有UDID的所有交易历史记录。。H