如何检测iOS应用程序已被重新安装(在Xcode)或升级(从苹果商店里)

问题描述:

,我们正在开发一个应用程序使用包含在应用程序包的二进制文件。如何检测iOS应用程序已被重新安装(在Xcode)或升级(从苹果商店里)

由于此文件需要处理,并在某些情况下,重新编写,应用程序将此文件复制到库/ Application Support目录在第一次发射,或当它在应用程序支持失踪。然后,应用程序每次启动时都会从应用程序支持中加载此文件并使用其中包含的数据。

随着应用程序支持目录在每一个应用程序被保留安装/升级,我们需要删除该目录下的上述二进制文件的应用程序安装或升级的时候,为了要重新复制它从应用程序包确保二进制文件结构与最新版本的应用程序兼容。

我们需要做的是,在以下两种情况下: - 在发展过程中,我们每次重建和XCode的 安装的应用程序 - 一旦活,每次用户升级从AppStore的应用程序

有什么方法来检测该应用程序已安装或设备上重新安装?

的(可能)的清洁,确保更新使用您的Info.plist文件变量的方法,如rmaddy说但这并不能解决精确地知道它是否需要或过度杀伤的问题。

我诚实地不知道苹果是否会让它通过自己的验证,但你也许可以存储并检查可执行文件的最后修改日期。如果比特定日期早,则更新。这似乎有点复杂,有这样一个粗版本控制机制。你不能在你的二进制文件中包含一个版本号吗?

要检查日期:

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

非常感谢。我认为克鲁格的解决方案对我来说更好。我们不希望添加新的参数,在plist中,因为在每一个有意义的重建,我们必须记住,即使在发展去改变它。使用krug的解决方案,我们可以将lastModDate存储在用户默认值中,并检查它是否等于每次应用启动时的可执行修改时间。如果它们不同,我们可以从应用程序支持目录中删除二进制文件,并从主包中重新复制。非常感谢 – Gianluca 2013-05-13 18:05:30

一种通用的方法是在你的Info.plist了“集结号”。每次构建时(或者每次二进制文件更改并需要再次处理时),都需要更新此编号。

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

+0

不会为我:应用程序版本号由詹金斯自动递增,但每一个现在,然后我需要安装一个手动创建的版本。内部版本号会更少(默认为1),或者与上次安装的版本相同。否则,我会推荐这种方法。 – JOM 2013-09-10 11:31:33

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

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

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