确定您的应用程序是否已在iOS中安装

确定您的应用程序是否已在iOS中安装,ios,swift,installation,keychain,Ios,Swift,Installation,Keychain,我需要检查我的应用程序以前是否安装在设备上 我有一个方法,将一些数据存储在钥匙链上,然后在第一次启动时,检查数据是否存在,从而确定应用程序是否以前安装过 不幸的是,像所有人一样,我遇到了苹果在上传版本时要求在你的应用程序中使用加密的“导出符合性信息”。目前还不清楚我们所要求的加密是否包括使用密钥链,这只是一个非常头痛的问题,而不是由开发人员在专业领域确定的问题 有没有其他方法可以确定之前是否安装过应用程序?在钥匙链中存储信息是目前唯一可靠的方法,直到苹果最终决定删除此(mis)功能 “导出符合性

我需要检查我的应用程序以前是否安装在设备上

我有一个方法,将一些数据存储在钥匙链上,然后在第一次启动时,检查数据是否存在,从而确定应用程序是否以前安装过

不幸的是,像所有人一样,我遇到了苹果在上传版本时要求在你的应用程序中使用加密的“导出符合性信息”。目前还不清楚我们所要求的加密是否包括使用密钥链,这只是一个非常头痛的问题,而不是由开发人员在专业领域确定的问题


有没有其他方法可以确定之前是否安装过应用程序?

在钥匙链中存储信息是目前唯一可靠的方法,直到苹果最终决定删除此(mis)功能


“导出符合性信息”在这里不起作用,这个问题与https中的加密相关。除非您实施自定义加密方案,否则您通常可以对问题回答“否”(或将您的答案添加到Info.plist中,然后添加
itsappusesnonextemptencryption

苹果多年来已禁用对设备唯一标识符的所有访问:UDID、MAC地址

所以答案是:不,没有其他方法可以在应用程序安装之间唯一地标识设备

有时唯一可行的方法是将推送通知令牌存储在服务器上。我不知道现在情况如何,但几年前,这个代币在应用程序重新安装后并没有改变。但根据苹果的文档,推送通知令牌不能保证保持不变。因此,它可能有效,也可能无效


要在使用推送令牌之前检查应用程序是否已安装,您需要在服务器上存储推送令牌和任何唯一ID(例如,最明显的UUID)。此唯一ID还必须存储在应用程序磁盘空间中(例如,最明显的
UserDefaults
)。然后,当应用程序启动时,您可以检查唯一ID是否已存在。。。等我想现在清楚了。

我没有想到apns代币。这很聪明。apns令牌在重新安装后不会改变,但我想OP会试图判断应用程序是否是在“删除然后再次安装”之前安装的,而不是在重新安装之后安装的。在重新安装之后,你会得到一个特定的回调吗?或者只是你可以缓存当前版本并在每个应用程序启动时进行比较,然后当你改变时,你会考虑重新安装/升级?@亲爱的,看到答案的底部部分。但我认为有些应用程序可以发现该应用程序之前是否安装过,比如Sketch提供30天的免费使用,之后就不起作用了,如果你删除并再次安装,该应用程序会识别你,macOs在这种情况下是否与iOS不同?@Omid要知道谁提供了30天的免费使用,Sketch会跟踪用户(而不是设备),通过应用程序内购买或某些帐户,对吗?不,实际上草图不是要安装的真实应用程序,它将自身复制到桌面或您想要的位置,并从该位置午餐,无需任何正常安装,也无需任何用户名或电子邮件询问,您可以删除该文件或应用程序,然后再次下载,但它将知道历史记录