我们正在开发的应用使用应用包中包含的二进制文件。
由于此文件需要处理并且在某些情况下需要重新编写,因此应用程序会在首次启动时或应用程序支持中缺少此文件时将此文件复制到库/应用程序支持目录中。然后,应用程序每次启动时都会从Application Support加载此文件,并使用其中包含的数据。
由于每个应用程序安装/升级都会保留应用程序支持目录,因此我们需要在安装或升级应用程序时删除此目录下的上述二进制文件,并从应用程序包中重新复制它以确保二进制文件结构与最新版本的应用程序兼容。
我们需要在以下两种情况下这样做: - 在开发过程中,每次我们从XCode重建和安装应用程序 - 一旦有用,每次用户从AppStore升级应用程序
有没有办法检测到应用已在设备上安装或重新安装?
答案 0 :(得分:5)
确保更新的(可能)干净方法是使用info.plist文件中的变量,正如rmaddy所说,但这并不能解决确切知道是否需要或过度杀伤的问题。
我真的不知道Apple是否允许它通过验证,但您可以存储并检查可执行文件的最后修改日期。如果它比某个日期早,那么更新。拥有如此粗略的版本控制机制似乎有点复杂。你不能在二进制文件中包含版本号吗?
检查日期:
NSString *exePath = [[NSBundle mainBundle] executablePath];
NSDictionary *exeAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:exePath error:nil];
NSString *lastModDate = [exeAttrs objectForKey:@"NSFileModificationDate"];
答案 1 :(得分:1)
一种通用方法是在Info.plist中使用“内部版本号”。您需要在每次构建时更新此数字(或者每次更改二进制文件并且需要再次处理时)。
然后,当应用程序启动时,它会从Info.plist中读取此数字。该应用还会获得它在NSUserDefaults
中存储的最后一个已知值。如果Info.plist中的数字较新(或者NSUserDefaults
中没有值),那么您知道必须处理该文件。然后将最新号码存储在NSUserDefaults
中。这将确保下次运行应用程序时,您不会再次处理该文件(除非它是新的构建或更新)。
答案 2 :(得分:0)
执行应用商店案例的最简单方法是将应用版本存储在NSUserDefaults
中,当应用版本不等于NSUserDefaults
中保存的值时,您知道需要重新复制文件。
对于从Xcode安装的情况,您可以使用类似下面的内容
#ifdef DEBUG
// Force the file to be recopied
#else
// Check if the app version changed before recopying the file
#endif