我们在iOS上有哪个唯一的设备标识符在安装/删除/重新安装应用程序时不会更改

我们在iOS上有哪个唯一的设备标识符在安装/删除/重新安装应用程序时不会更改,ios,swift,uuid,Ios,Swift,Uuid,我想收集安装事件(在新应用程序上)和帐户创建事件(在所有旧应用程序上) 为了确保唯一性并防止欺诈(即每个安装都应对应于一个唯一的设备,如果在同一设备上卸载并重新安装应用程序,则应保持相同的事件),我们可以使用卸载后仍然有效的硬件标识符 在android手机上,IMEI可以用作唯一标识符,但这个解决方案在iOS上不可重复,因为出于隐私原因,苹果不允许访问任何硬件或唯一标识符 我尝试了以下链接中提出的方法: 从链接1和链接3,我尝试了: 让deviceID=UIDevice.current

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

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

在android手机上,IMEI可以用作唯一标识符,但这个解决方案在iOS上不可重复,因为出于隐私原因,苹果不允许访问任何硬件或唯一标识符

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

  • 从链接1和链接3,我尝试了:

    让deviceID=UIDevice.current.identifierForVendor!。uuidString

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


    请问有没有更好的方法让我用swift来处理这个问题。谢谢大家!

    UUID解除润滑后,无法100%实现这一点,您可以在keychain中存储标识符,但从iOS 10.3开始,当您删除应用程序时,所有相关的keychain项目都将被删除

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

  • 创建自己的随机数

    - (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;
    }
    

  • 如果您想识别用户的设备,即使用户重新安装了您的应用程序,也可以使用iOS 11中引入的设备检查API

    您的服务器可以在apple设备上使用生成的令牌。有关更多详细信息,请参阅以下文档


    然后在
    钥匙链中保存值。在iOS 11上,您应该使用感谢您的回答,我可以获得此代码的swift版本吗?此代码不会满足您的要求。卸载应用程序时,将清除用户默认设置。在最新版本的iOS(9+或10+,我不记得是哪个)中,钥匙链也被清除了。我正在使用这段代码,它工作得非常好。正如我提到的Keychain或User Default,如果你想在卸载应用程序后保留数据,你可以使用Keychain,它的Keychain引入了iOS8左右,现在有点旧了,现在大多数应用程序的最低版本都支持ios9或10谢谢你展示这个鲜为人知的API。我没有意识到这一点,这是一个非常好的添加。在删除和重新安装应用程序时,这也会得到不同的值。
    
    [[NSUserDefaults standardUserDefaults] setObject:randomNumber forKey:@"randomNum"];
    [[NSUserDefaults standardUserDefaults]synchronize];