发布新版本的应用程序会删除旧版本的文件吗?
Posted
技术标签:
【中文标题】发布新版本的应用程序会删除旧版本的文件吗?【英文标题】:Does releasing a new version of the app delete files of the older one? 【发布时间】:2011-11-12 13:45:44 【问题描述】:我将发布我的应用的新版本。以前的版本使用了一些文件,在新版本中发生了变化,需要处理。我希望在用户更新应用程序时自动删除旧文件,否则应用程序会看到它们并将处理它们(由于文件格式更改而导致错误)。 有没有办法做到这一点?
谢谢。
【问题讨论】:
我还想注意,算法基本上是这样的:1)如果文件不存在,请下载它们 2)处理文件。问题是我无法替换旧文件,因为我需要从互联网上下载它们。那么我该如何继续呢? 【参考方案1】:由于您正在处理这些文件,一种选择是以某种方式将格式版本放入文件或文件夹路径中。将该版本烘焙到应用中的常量中。
应用程序可以始终通过将常量附加到获取这些文件的路径来查找这些文件,或者查看文件的数据以获取格式版本并正确处理它(删除、重新下载等... )。
另一个好处是,如果您发布应用并且格式版本没有改变(很可能 - 您只是修复了错误),您不必删除并重新下载这些文件。您也不必更改任何内容或更新任何例程 - 只需不更改文件格式常量,它就不会更改您的文件。如果您更改文件的格式,请更新该常量,它就可以正常工作。
【讨论】:
我喜欢这种方法,但我倾向于将数据的版本作为变量放在数据文件本身中,这样我只需要搜索一个文件名。 @Javy:使用应用程序版本的缺点是您的版本总是在变化 - 只有在文件格式版本发生变化时重新下载,而不是应用程序版本。 我不关注。版本保持不变(捆绑版本)。在启动时进行检查以确保版本相同,如果不是,则在运行主应用程序之前进入例程处理数据更新。例程(方法)被编码在更新版本的代码中,并且知道如何处理版本更改(重新下载、转换现有等)。还是我错过了你的意思? 对 - 处理更新数据的例程需要以某种方式确定它是否需要更新数据。我是说使用文件格式版本常量来查看它是否需要更新数据 - 如果数据中包含该文件格式或者它位于该格式版本的路径中,那么保留它或重新下载它。 我处理版本控制的方式有缺点吗?我是出于好奇而不是粗鲁地问。我认为应用程序更新将能够使用新的“else if”检查修改更新版本方法,以比较版本并相应地处理更新。也许我的方式有一个缺点我错过了?【参考方案2】:从代码包中获取应用程序的版本并根据需要执行必要的更改始终是一个好习惯:
NSString* versionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
然后您可以比较此字符串(或字符串的浮点版本)以确定要对数据进行哪些更改。您可能会删除旧数据(如您的情况),或提取一些旧数据并创建新数据(通常方式),或者应用程序可能根本不需要更改。
要记住的重要一点是,您可能会上传/发布一个应用的多个版本,而某些用户可能还没有下载较新的版本。因此,最好让方法根据版本字符串更新数据,而不是期望它是数据的最后一个版本。
【讨论】:
使用 appVersion 的缺点是 appVersion 更改比您的文件格式更改更频繁(例如错误修复)。如果您修复二进制错误,这将导致用户不必要地重新下载文件。两者不同,不需要耦合。 但如果是简单的错误修复,代码可以告诉它不要不下载。 if( version == 2.02 ) // 不下载/更改数据,只更新数据版本号 您不应该根据版本和构建大开关块等附带数据来确定是否需要更新数据。让数据定义是否需要更新。如果数据具有文件格式版本(或按文件格式版本存储在路径中),那就是事实,并且定义了是否需要更新。以上是关于发布新版本的应用程序会删除旧版本的文件吗?的主要内容,如果未能解决你的问题,请参考以下文章
如果我上传新版本的应用程序,TestFlight 会删除我以前的构建吗?
安卓手机上的软件,如果把新版本的替换成旧版本的,那么数据还会不会保留?
如果在设备上部署了新版本的应用程序,是不是可以保留旧版本的数据?