如何检测iOS应用程序已重新安装(从XCode)或升级(从AppStore)

我们正在开发的应用程序使用包含在应用程序包中的二进制文件。

由于此文件需要处理,并且在某些情况下需要重新编写,所以应用程序会在首次启动时或者在“应用程序支持”中缺less该文件时,将该文件复制到“库/应用程序支持”目录中。 然后,应用程序每次启动时都会从应用程序支持中加载此文件,并使用其中包含的数据。

由于每个应用程序安装/升级都保留了应用程序支持目录,因此在安装或升级应用程序时,我们需要删除此目录下的上述二进制文件,然后从应用程序包中重新复制,以确保二进制文件文件结构与最新版本的应用程序兼容。

我们需要在以下两种情况下这样做: – 在开发过程中,每次我们从XCode重build和安装应用程序时 – 每次用户从AppStore升级应用程序

有什么办法可以检测到应用程序已经安装或重新安装在设备上?

确保更新的(可能)干净的方法是在你的info.plist文件中使用一个variables,就像rmaddy所说的那样,但是这并不能解决精确地知道它是否需要或者过度杀伤的问题。

我真的不知道苹果是否会通过他们的validation,但你可以存储和检查可执行文件的最后修改date。 如果比某个date早,则更新。 拥有这样一个粗糙的版本机制似乎有些复杂。 你不能在你的二进制文件中包含一个版本号吗?

检查date:

NSString *exePath = [[NSBundle mainBundle] executablePath]; NSDictionary *exeAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:exePath error:nil]; NSString *lastModDate = [exeAttrs objectForKey:@"NSFileModificationDate"]; 

一个一般的方法是在你的Info.plist中有一个“内部版本号”。 您需要在每次构build时更新此编号(或每次更改二进制文件并需要重新处理时)。

然后,当应用程序启动时,它从Info.plist中读取这个数字。 该应用程序还获取它存储在NSUserDefaults的最后一个已知值。 如果Info.plist中的数字更新(或者NSUserDefaults没有数值),那么您知道您必须处理该文件。 然后将最新的数字存储在NSUserDefaults 。 这将确保下一次运行应用程序时,不会再次处理文件(除非是新build或更新)。

执行app store案例的最简单方法是将应用程序版本存储在NSUserDefaults ,当应用程序版本不等于NSUserDefaults保存的值时,您知道需要重新复制该文件。

对于从Xcode安装的情况,你可以使用类似下面的东西

 #ifdef DEBUG // Force the file to be recopied #else // Check if the app version changed before recopying the file #endif