首页 > 解决方案 > 更新应用程序后,iOS 上的本地文件会发生什么情况?

问题描述

我的 iOS 应用程序正在将本地文件写入:

/var/mobile/Containers/Data/Application/A.../Library/a.txt

当我的应用更新时,它会获得一个新的应用容器 ID 和文件夹:

/var/mobile/Containers/Data/Application/B...

我写到容器 ID A 的所有文件会发生什么?

是否有一个“更新挂钩”可以让我将所有“A”容器文件复制到路径“B”?

新版本的应用程序(B)可以读取旧版本的文件(A)吗?

是否有关于更新期间文件系统发生的情况的任何文档?

安装 B 后是否可以从容器 A 中恢复文件?

标签: ios

解决方案


当您更新应用程序时,通过在 .plist 文件中更改其版本号,iOS 会为该应用程序创建一个具有不同十六进制名称的新目录,并将所有文件复制到新目录中。现在,如果您使用绝对路径从目录中获取文件的详细信息,那么这些路径将不正确,您将无法获取文件详细信息。

我刚刚在模拟器中试过这个。我创建了一个如下函数,它将返回文档目录路径 url

func getDocumentsDirectory() -> URL {

    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let documentsDirectory = paths[0]
    return documentsDirectory
}

当版本号为 1.0 时,我从应用程序委托中的 didFinishLaunchingWithOptions 调用此函数,并返回以下路径:

file:///Users/BhargavRathod/Library/Developer/CoreSimulator/Devices/3082611F-BCCA-4D17-B390-E0EF4CA454DA/data/Containers/Data/Application/72759097-38F3-4292-825E-1D2343219973/Documents/

当我将版本号更新为 1.1 时,它向我返回了新路径:

file:///Users/BhargavRathod/Library/Developer/CoreSimulator/Devices/3082611F-BCCA-4D17-B390-E0EF4CA454DA/data/Containers/Data/Application/72DC31E9-C32F-42CC-8449-F1946ADB1018/Documents/

因此,如果您使用绝对路径从文档目录访问任何文件,那么这不是一个好习惯。您可以只保存文件名(或文档目录之后的相对路径),每当需要访问该文件名时,然后获取文件名并将其附加到文档目录路径之后并访问该文件。

我希望这会对你有所帮助。


推荐阅读