如何检测iOS应用程序是否被重新安装(来自XCode)或升级(来自AppStore)

3
我们正在开发的应用程序使用了一个包含在应用程序捆绑包中的二进制文件。
由于该文件需要处理,并且在某些情况下需要重新编写,因此应用程序会在第一次启动或在Application Support中缺少时将该文件复制到Library/Application Support目录中。然后,每次启动应用程序时,应用程序都会从Application Support加载此文件并使用其中包含的数据。
由于Application Support目录在每次应用程序安装/升级时都会被保留,因此我们需要在应用程序安装或升级时删除上述二进制文件,并从应用程序捆绑包中重新复制它,以确保二进制文件结构与应用程序的最新版本兼容。
我们需要在以下两种情况下执行此操作: - 开发期间,每当我们从XCode重新构建和安装应用程序时 - 上线后,每当用户从AppStore升级应用程序时
有没有办法检测应用程序是否已安装或重新安装到设备上?
3个回答

6
(可能)确保更新的干净方法是使用 info.plist 文件中的变量,如 rmaddy 所说,但这并不能解决知道是否需要更新的问题。
老实说,我不知道苹果是否会让它通过他们的验证,但您可以存储和检查可执行文件的最后修改日期。如果它比某个日期旧,则进行更新。似乎有点复杂,只为了实现一个粗糙的版本控制机制。难道您不能在二进制文件中包含版本号码吗?
要检查日期,请执行以下操作:
NSString *exePath = [[NSBundle mainBundle] executablePath];
NSDictionary *exeAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:exePath error:nil];
NSString *lastModDate = [exeAttrs objectForKey:@"NSFileModificationDate"];

非常感谢。我认为krug的解决方案更适合我的情况。我们不想在属性列表中添加新参数,因为在每次重建时都必须记得更改它,即使在开发期间也是如此。使用krug的解决方案,我们可以将lastModDate存储在用户默认设置中,并在每次应用程序启动时检查它是否等于可执行文件修改时间。如果它们不同,我们可以从主包重新复制二进制文件并从Application Support目录中删除它。非常感谢。 - Gianluca

1
一种常见的方法是在 Info.plist 中设置一个“构建编号”。每次构建时(或者只有二进制文件变化并需要重新处理时),您都需要更新此编号。
然后,当应用程序启动时,它会从 Info.plist 中读取此编号。应用程序还会获取它在 NSUserDefaults 中存储的上一个已知值。如果来自 Info.plist 的编号更新(或者 NSUserDefaults 中尚未有值),则您必须处理该文件。然后将最新编号存储在 NSUserDefaults 中。这将确保下次运行应用程序时,您不会再次处理该文件(除非是新的构建或更新)。

对我来说不太适用:应用程序构建编号是由Jenkins自动递增的,但偶尔我需要安装一个手动创建的版本。构建号应该比上一个已安装版本低(默认为1)或者相同。否则我会推荐这种方式。 - JOM

0
在编写应用程序的情况下,最简单的方法是将应用程序版本存储在 NSUserDefaults 中,当应用程序版本不等于在 NSUserDefaults 中保存的值时,您就知道需要重新复制该文件。
对于从Xcode安装的情况,您可以使用类似以下的内容。
#ifdef DEBUG
    // Force the file to be recopied
#else
    // Check if the app version changed before recopying the file
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接