【问题标题】:Which unique device identifier do we have on iOS that does not change when an application is installed / removed / re-installed我们在 iOS 上拥有的唯一设备标识符在安装/删除/重新安装应用程序时不会改变
【发布时间】:2018-09-15 07:21:15
【问题描述】:

我想同时收集安装事件(在新应用上)和帐户创建事件(在所有旧应用上)。

为确保唯一性并防止欺诈(即每次安装都应对应于唯一的设备,并且如果在同一设备上卸载并重新安装应用程序,则应保持相同的事件)我们可以使用硬件标识符可以卸载。

在 android 手机上 IMEI 可用作唯一标识符,但此解决方案在 iOS 上不可重复,因为出于隐私原因,Apple 不会访问任何硬件或唯一标识符。

我尝试了以下链接中提出的方法:

  1. link1

  2. link2

  3. link3

    从链接 1 和 3 我尝试过:

    让 deviceID = UIDevice.current.identifierForVendor!.uuidString

但这并没有提供一个唯一的 ID,一旦卸载并重新安装应用程序,该 ID 将保持不变。

请问有没有更好的方法让我快速处理这个问题。谢谢!

【问题讨论】:

标签: ios swift uuid


【解决方案1】:

如果您想在用户重新安装您的应用程序的情况下识别用户的设备,您可以使用 iOS 11 中引入的 Device Check API。

您的服务器可以在苹果设备上使用生成的令牌。更多详情请参考以下文档

https://developer.apple.com/documentation/devicecheck/dcdevice/2902276-generatetoken

【讨论】:

  • 感谢您提供这个鲜为人知的 API。我不知道,这是一个非常好的补充。
  • 在删除和重新安装应用程序时,这也总是得到不同的值。
【解决方案2】:

UUID 删除后不可能 100% 做到这一点,你可以在钥匙串中存储一个标识符,但从 iOS 10.3 开始,当你删除应用程序时,所有关联的钥匙串项都将被删除

【讨论】:

    【解决方案3】:

    目前没有办法(在 iOS 5 之前)获取静态 UDID 或任何与设备相关的 ID。我也遇到了这个问题,我做了以下实现。

    1. 创建自己的随机数

      - (NSMutableString*)getSecureGeneratedNumber
      {
          uint8_t randomBytes[16];
          int randomNumber = SecRandomCopyBytes(kSecRandomDefault, 16, randomBytes);
          NSMutableString *uuidStringReplacement;
          if(randomNumber == 0) {
              uuidStringReplacement = [[NSMutableString alloc] initWithCapacity:16*2];
              for(NSInteger index = 0; index < 16; index++)
              {
                  [uuidStringReplacement appendFormat: @"%02x", randomBytes[index]];
              }
              NSLog(@"uuidStringReplacement is %@", uuidStringReplacement);
          } else {
              return 0;
              NSLog(@"SecRandomCopyBytes failed for some reason");
          }
          return uuidStringReplacement;
      }
      
    2. 将此随机数保存在 User Default 或 Keychain 中

      [[NSUserDefaults standardUserDefaults] setObject:randomNumber forKey:@"randomNum"];
      [[NSUserDefaults standardUserDefaults]synchronize];
      

    【讨论】:

    • 感谢您的回答,请问我可以获取此代码的 swift 版本吗?
    • 此代码无法满足您的要求。卸载应用程序时会清除用户默认值。在最近的 iOS 版本中(9+ 或 10+,我不记得是哪个),钥匙串也被清除了。
    • 我正在使用这段代码,它工作得很好。正如我提到的钥匙串或用户默认值,如果你想在卸载应用程序后保留数据,你可以使用钥匙串,它的钥匙串在 iOS8 左右引入,现在有点旧了,现在大多数应用程序的最低版本都支持 ios9 或 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多