我的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恢复文件?
答案 0 :(得分:5)
更新应用程序时,通过更改.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/
因此,如果您使用绝对路径从文档目录访问任何文件,那么这不是一个好习惯。您可以只保存文件名(或文档目录后的相对路径),只要需要访问该文件名,就可以获取文件名并将其附加在文档目录路径后并访问文件。
我希望这会对您有所帮助。
答案 1 :(得分:2)
我的iOS应用正在将本地文件写入以下位置:/ var / mobile / Containers / Data / Application / A ... / Library / a.txt
好的,就在那儿停下来。错了
您的应用程序具有自己的沙箱。只要您的应用程序保留其Bundle ID,并且用户没有删除该应用程序,此沙箱将一直保留到更新。
因此,您无需进行业务了解或思考文件所在位置的完整绝对路径。所有您需要知道的是,它位于应用程序的“库”目录中的沙箱中。您可以随时通过其搜索路径获取Library目录的URL:
这就是文件将永远存在的地方。只要您向FileManager询问您的“ Library”目录以及其中的 a.txt 文件,只要用户实际上并未删除,无论是否进行任何更新,都将找到相同的文件。您的应用程序(因为这会删除沙箱)。
可以解释文件会发生什么情况
什么都没有。他们会停留在沙箱中的位置。沙箱的绝对URL可能会更改,但是您的文件不受影响。
如何保留由该应用的先前版本编写的文件
它们会自动保存。您无需做任何事情。
(说了这么多,请记住,如果提交的应用程序具有不同的捆绑包ID ,则该应用程序不是新版本。它是完全不同的应用程序。如果您要解决的问题非常不同,那么这与将文件从一个应用程序传递到另一个应用程序的其他任何问题都没有什么不同。您需要将文件放在一个公共位置,通过文档浏览器将其提供,使它们可由用户或其他用户导出。)