肘子的 Swift 记事本

健康笔记 2.0 开发随笔(一)

发表于

为您每周带来有关 Swift 和 SwiftUI 的精选资讯!

健康笔记从 2020 年 1 月上线以来,至今已经过了大半年的时间(可以从 老人新兵 —— 一款 iOS app 的开发手记 了解健康笔记 app 的由来)。在这段时间里,我对于 Swift、SwiftUI、CoreData 等都有了进一步的了解和认识。在开发 1.0 版本时所面对的问题和疑惑多数都得到了解决。

最近随着 iOS 14 发布的临近,同时也想将这短时间来学习的知识进行更系统的整理和应用,于是便将健康笔记 2.0 的开发工作提上了日程,并已经着手进行中。

健康笔记 2.0 的规化

  • 功能

    健康笔记 1.0 目前的功能已基本能够满足我个人的日常使用,在上线这段时间内,我也根据用户提出的建议增加了部分新功能。因此在 2.0 上,App 核心功能的增加并不是太多,主要集中在两点:

  • 数据类型

    1.0 中当前支持两种数据类型,一种是数字型(仅记录一个数字 + 日期),另一个是选项型(自定义选项内容 + 日期),在 2.0 中,新增了其他 5 中数据类型包括:双数字型、数字选项型、起始时间型等。使用者可以记录生活中更多种类的内容。

  • 数据导入导出

    1.0 中已经提供了对于数字卡片、条目等内容的数据各自的导出支持(csv, pdf, xslx), 2.0 版中将提供同一的导出入口,并将提供导入功能。用户可以有更多段选择保管并使用自己的数据,比如将自己创建的卡片分享给其他用户,或者重新导入自己保存的离线数据等。

既然是一次大版本的更新,虽然在功能上的改变并非太多,但在其他地方的变化还是会很大的,更多的变化都会在后文中提到。

开发环境、框架

Xcode 12 + SwiftUI 2.0,主要的原因如下:

  • 从 WWDC 20 以来我一直在跟踪并学习 iOS 14 下的新特性(我的最近的文章大多都有关于此),以及 SwiftU 2.0 中提供的新功能。在规划初始,我打算在 2.0 中使用不少的新功能来完成自己的构思。由于 iOS 14 对于硬件的支持完全涵盖的之前 iOS 13 的机型,相信对于 iOS 13 的用户来说,更新的阻力不会太大。

  • 当前的用户数并不多,历史包袱较小。从上线来,目前健康笔记的总下载量才刚刚超过 1000,因此让我可以轻装上阵,有较大的调整空间。

  • 1.0 版本中很多的规划、设计不完善。最近几个月,我已经很少向 1.0 版本中增加新的功能了,主要原因就是最开始的结构设计不合理、代码混乱。如果强行添加更多的功能,只会导致留下更多的隐患,反倒不利于今后的调整。所以在 2.0 中,决定将之前的数据结构设计进行了较大的改变,将 1.0 的代码全部推翻重写。

  • 数据迁移的问题。由于 1.0 的数据结构设计不佳,我打算在 2.0 中进行大变化,这样会导致 CoreData 的数据迁移面临严峻的考验。在 1.0 版本的数据小升级中,我已经领教到了 CoreData 的迁移机制所带来的便利性和难以控制的双面问题。尽管可以通过编写自己的 CoreData 迁移代码来解决结构大变化时所面临的难题,不过为了不留下隐患、给将来的扩充留下更自由的空间,还是决定放弃了使用 CoreData 的迁移机制。

  • 我本来就打算在 2.0 中进一步加强数据的导入导出,所以对于 1.0 版本的用户,我将提供安全的数据迁移能力,平滑的过度到 2.0 上。

    结果就是:用户将重新在 app store 上下载健康笔记 2.0 app(不是在 1.0 上更新),2.0 将支持 iOS 14、macOS 11 及以上的系统。之前的健康笔记 1.0 用户数据都可以安全方便的手动转移到 2.0 版本上。

  • 支持多平台

    2.0 将支持 iPhone, iPad 和 macOS。

    SwiftUI 本身对于多平台的支持就非常出色,不过为了能够在不同的硬件平台下更好的发挥其各自的特点,我还是决定为支持多平台做更多针对性的调整。

    • iPhone 下仍同 1.0 一样强制竖屏使用。

    • iPad 下强制横屏使用,并采用了和 iPhone 下完全不同的布局。

    • macOS 下不使用 Catalyst,而使用原生的 macOS target 进行编写。虽然加大了工作量,但可以更好的适配桌面操作,尤其是提供同手指操作完全不同键鼠交互逻辑,并采用更适合桌面平台的布局和控件操作。

    • 我在最近编写的 Swift 库中,基本上都提供了跨平台的支持。

    • 由于决定了进行完全的跨平台开发(uikit+appkit),因此在选择第三方库的限制将会更多。

  • 多语种

    健康笔记的本身的文字量并不多,因此单纯从文本内容的角度来看,多语种支持并不复杂。不过由于涉及了不少的数据显示、日期计算等,在真正进行多语种支持的时候还是遇到了不少挑战。

    在目前的开发版本中,已经可以让用户在 app 中单独设置语言、时区而不完全依赖系统设定。

    目前仍没有想好的多语种支持问题主要存在于 Demo 数据的加载上。我希望能找到一个工作量较小、数据量较小的解决方案。

代码结构

健康笔记 2.0 将代码完全推翻重写,其中极为重要的一个原因是我想实现一个自己认可的能适用于 SwiftUI 的 MVVM 结构。

我在开发 1.0 版本的时候才接触到 MVVM,在最初的开发过程中,基本上是按照别人提供的代码逻辑来完成的。在实际的使用中一方面发现了很多自己不理解或用起来不顺手的地方,同时在不断的学习中,也发现了很多传统 MVVM 不完适应 SwiftUI 框架的问题。最近几个月,我一直在学习并研究适用于 SwfitUI 的 MVVM 结构,2.0 的开发中这些学习结果将得到充分的检验机会。

Xcode 12 中提供了 SwiftUI lifecycle,从程序入口点,到 App Delegate、Scene Delegate 响应都有了彻底地改变,如何设计一个更适合 Swfit 2.0 的状态机在不少论坛进行了讨论和分析。我目前在开发中采用的结构对这些都做了有针对性的调整。并且为多平台,多语种都提供不错的响应支持。同时为了便于使用 Preview,对于 CoreData 的声明和注入也做了针对性的调整。

之后,我会专门写一篇关于这方面的文章和大家一起研究谈探讨。

我将在开发过程中,不定时地更新随笔。一方面对自己的思路进行一个梳理,同时也希望能够给其他的个人开发者提供一点参考。

我非常期待听到您的想法! 请在下方留下您的评论 , 分享您的观点和见解。或者加入我们的 Discord 讨论群 ,与更多的朋友一起交流。

Fatbobman(东坡肘子)

热爱生活,乐于分享。专注 Swift、SwiftUI、Core Data 及 Swift Data 技术分享。欢迎关注我的社交媒体,获取最新动态。

你可以通过以下方式支持我