通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是什么?

rad*_*vus 1 iphone ios swift

背景

我通过 Windows 窗体 (C#)、Android(Java 和 Kotlin)、HTML5 Web 应用程序、ElectronJS(在 Linux、Mac 和 Win10 上运行)甚至作为 UWP(通用 Windows 平台)应用程序编写了一款特定的应用程序。

全部使用 JSON 文件作为数据

所有这些应用程序都使用完全相同的 JSON 格式数据进行用户设置。这意味着我可以通过相同的文件和文件格式在所有平台上共享数据。在 Android 上,将文件保存在 UserPrefs 中还有一个额外的好处(为用户提供安全性和备份)。

问题 我还将该应用程序编写为 iPhone/iPad 应用程序 (Swift),但是我找不到处理 JSON 文件存储的正确方法。
该问题与将 JSON 反序列化到我的业务对象无关。一切都很好。但是,我不确定:

  1. iPhone/iPad系统中的文件应该存储在哪里?
  2. 您可以将文件保存在某种用户首选项或应用程序数据位置吗?
  3. 如何打开文件进行读/写和读/写数据?(迅速)
  4. 如何更好地了解可用于读写文件的路径?

我到处寻找这个答案。您能给我指出官方文档、书籍、StackOverflow 项目或其他可以清楚解释这一点的内容吗?(希望有 Swift 示例。)

Rob*_*Rob 5

请参阅iOS 存储最佳实践视频和文件系统基础知识文档。这应该能让你继续前进。

\n\n

简而言之,应用程序数据一般存储在\xe2\x80\x9c应用程序支持目录\xe2\x80\x9d,暴露给用户的文档(例如Files应用程序)存储在\xe2\x80\x9cdocuments\xe2\x80\x9d文件夹中,可以轻松重新检索的下载存储在 \xe2\x80\x9ccaches\xe2\x80\x9d 文件夹中。从技术上讲你可以使用UserDefaults存储此类应用程序数据,但它实际上并不是用于此目的。

\n\n

重新打开 \xe2\x80\x9cread/write\xe2\x80\x9d 文件,在处理 JSON 时,通常不会这样做。您将文件读入 aData并将 JSON 反序列化为模型对象。

\n\n
do {\n    let fileURL = try FileManager.default\n        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)\n        .appendingPathComponent("appdata.json")\n\n    let data = try Data(contentsOf: fileURL)\n    let appData = try JSONDecoder().decode(AppData.self, from: data)\n    // do something with appData\n} catch { \n    print(error)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当您想要更新时,您可以将模型对象序列化为DataJSON 的文件,然后将其写入文件,替换该文件。

\n\n
do {\n    let fileURL = try FileManager.default\n        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)\n        .appendingPathComponent("appdata.json")\n\n    let data = try JSONEncoder().encode(appData)\n    try data.write(to: fileURL)\n} catch { \n    print(error)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,这假设类型AppData(或无论你如何称呼它)符合Codable,但你说你熟悉 JSON 的序列化。有关详细信息,请参阅编码和解码自定义类型

\n