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

Posted

技术标签:

【中文标题】通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是啥?【英文标题】:What is correct way to store/retrieve user data (read/write files) in iPhone (iOS) dev via Swift?通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是什么? 【发布时间】:2020-05-04 14:38:06 【问题描述】:

背景

我已经通过 Windows Forms (C#)、android(Java 和 Kotlin)、html5 Web App、ElectronJS(在 Linux、Mac 和 Win10 上运行)甚至作为 UWP(通用 Windows 平台)应用程序编写了一个特定的应用程序.

所有数据都使用 JSON 文件

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

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

    文件在 iPhone/iPad 系统中应该存储在哪里? 您可以将文件保存在某种用户偏好或应用数据中吗 地点? 如何打开文件进行读/写和读/写数据? (斯威夫特) 如何更好地理解可用于读写的路径 文件?

我已经到处寻找这个答案。你能指出我的官方文档、一本书、一个 *** 项目或能清楚解释这一点的东西吗? (希望有 Swift 的例子。)

【问题讨论】:

【参考方案1】:

参见ios Storage Best Practices 视频和File System Basics 文档。这应该会让你继续前进。

简而言之,应用程序数据通常存储在“应用程序支持目录”中,暴露给用户的文档(例如 Files 应用程序)存储在“文档”文件夹中,可以轻松重新检索的下载存储在“缓存”中“ 文件夹。从技术上讲,您可以使用 UserDefaults 来存储此类应用程序数据,但它确实不是为此目的。

重新打开文件进行“读/写”,在处理 JSON 时,您通常不会这样做。您将文件读入 Data 并将 JSON 反序列化为您的模型对象。

do 
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try Data(contentsOf: fileURL)
    let appData = try JSONDecoder().decode(AppData.self, from: data)
    // do something with appData
 catch  
    print(error)

当您想要更新时,将模型对象序列化为包含您的 JSON 的 Data,然后将其写入文件,替换文件。

do 
    let fileURL = try FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("appdata.json")

    let data = try JSONEncoder().encode(appData)
    try data.write(to: fileURL)
 catch  
    print(error)

显然,这假设AppData 类型(或任何你称之为的类型)符合Codable,但你说你熟悉JSON 的序列化。请参阅Encoding and Decoding Custom Types 了解更多信息。

【讨论】:

感谢您提供如此有用的摘要。现在我有了一些术语 (.applicationSupportDirectory) 和我链接的那些视频,我有了一个起点。而且,是的,我已经制定了我的 Codable 模型对象,只是需要一种方法来写出它并每次反序列化它。再次感谢。我会查看所有内容,稍后再回来标记为答案。 试用了您提供的示例代码,它非常适合我的情况。我非常感谢您提供代码以及其他帮助。将此标记为答案。

以上是关于通过 Swift 在 iPhone (iOS) 开发中存储/检索用户数据(读/写文件)的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中获取 iPhone 位置,无需将“位置服务”设置为“开”

CoreData 适用于我的模拟器,但不适用于使用 xCode 6 的 iOS 8 Swift 中的 iPhone

在 UILabel 中显示 HTML 文本,性能问题。 [iPhone SDK、iOS 8、Swift]

swift [英寸尺寸]获得iPhone尺寸的英寸#tags:swift,ios

iOS 11 Swift 4 iPhone X Safe Area 支持全屏ScrollView

iOS Swift,如何区分使用 Apple Watch 和 iPhone 的步骤?