【问题标题】:What happens to local files on iOS when the app is updated?更新应用程序后,iOS 上的本地文件会发生什么情况?
【发布时间】:2019-10-05 13:13:30
【问题描述】:

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

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

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

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

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

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

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

是否有关于更新期间文件系统发生了什么的文档?

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

【问题讨论】:

  • 我认为更新应用不会删除 Documents 目录中的当前文件。
  • 想想吧。如果每次应用更新都导致数据丢失,用户会有什么反应?您在开发应用程序时有什么经验?每次您在 Xcode 中进行另一次构建时,基本上与进行应用程序更新相同。您的数据是否在构建之间丢失?
  • 是的,您会在构建和应用更新期间获得一条新路径。但是您的数据会消失吗?您是否曾经丢失过更新 iOS 设备上的任何应用程序的应用程序数据?只要您的应用没有在数据库或类似文件中存储文件的绝对路径,您是否遇到过问题?
  • @zino 同样,当您进行新构建时,您的文件会消失吗?不,他们不是。事情很好。 iOS 将沙盒复制到新位置。
  • 容器ID是否改变并不重要,尽管你应该假设它会改变。但是,如果您的应用关心容器 id 是否更改,那么您的代码编写不正确。

标签: ios


【解决方案1】:

当您更新应用程序时,通过在 .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/

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

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    我的 iOS 应用正在将本地文件写入:/var/mobile/Containers/Data/Application/A.../Library/a.txt

    好的,停在那儿。这是错误的。

    您的应用拥有自己的沙盒。只要您的应用保留其 Bundle ID,并且只要用户不删除该应用,此沙盒就会通过更新永久存在。

    因此,您无需知道或考虑文件所在位置的完整绝对路径。您所知道的以及您需要知道的只是它位于您应用程序的沙箱中的 Library 目录中。您可以随时通过搜索路径获取库目录的 URL:

    https://developer.apple.com/documentation/foundation/filemanager/searchpathdirectory/librarydirectory

    这就是文件永远存在的地方。只要您向 FileManager 询问您的库目录和其中的 a.txt 文件,您就会发现相同的文件,无论是否有任何更新,只要用户没有实际删除您的应用程序(因为这会删除沙箱)。

    可以解释文件发生了什么

    什么都没有。它们停留在沙盒内的位置。沙盒的绝对 URL 可能会更改,但您的文件不受影响。

    如何保留以前版本的app写的文件

    它们是自动保存的。你不必做任何事情。


    (说了这么多,请记住,如果您提交的应用具有不同的 bundle id,这不是您应用的新版本。它是一个完全不同的应用。在那个如果您需要解决一个非常不同的问题。这与将文件从一个应用程序传输到另一个应用程序的任何其他问题没有什么不同。您需要将文件放在一个公共位置,通过文档浏览器使它们可用,使它们可由用户导出,或其他任何东西。)

    【讨论】:

    • 嗨@matt,我关注你的评论,但我仍然在每次启动时获得新路径,已经保存的文件也不存在,所以每次创建都是新的。我在这个链接里问过问题,你能不能复习一下:stackoverflow.com/questions/63423828/…
    • @Prasanth 在我看来,这里的答案也回答了另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2014-03-05
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多