做一款长期主义的App「V2RMB」

长期主义?我?哈哈哈,先看两年吧。等我到时候没放弃的时候,那应该可以 review 一下。

开发背景

在 2020 年刚开始疫情封控的时候,我也被封在家里了,那段时间公司也没办法展开任何业务,所以我就开始寻找一些能消磨时间的事情做,学习 SwiftUI 在我看来就是一个不错的契机。

但在当年的时间节点,ChatGPT 还没出现在大家的视野,SwiftUI 本身也一大堆问题,很多地方还需要 UIKit 来解决问题,所以当时学习的时候也非常的痛苦,更不要说当时 SwiftUI 的文档也是一坨,但在被封控的这段时间里,好像也没那么难地去攻坚下去,算事因祸得福吧。

农小记商店截图

当年开发了一个多月时间,也磕磕绊绊地开发出来了一款 App,「农小记」,功能超级简单,但它免费、轻量(安装包不到1M)、没广告,你现在依旧可以在 App Store 下载到(非国区才有)。

当时就适配了 Apple Watch 和 iPad

从 App 的名称来看,大家应该也大概猜到了它的主要使用场景,在这种场景下其实同类型应用特别多,倒数日、生日提醒、Happy Days 等等,我为什么还要单独开发一个这样的产品出来呢,首先,在 2020 年刚开始开发的时候,作为练手项目,要么就是笔记类软件,要么就是 TODO 类软件,要么就是番茄时钟,没别的选择,再选的话上手难度就太高了。
农小记商店截图
但其实当时我第一个目标是做一个网易云音乐第三方,这个另找时间再聊吧,都是泪。当时名气比较大的就只有倒数日这一家,而且当时他也没办法设置一项生日记录循环计算下一个生日的到期时间,而且倒数日在当时的小组件只能显示一个日子,我就想做一个显示列表的,一切好像都很合理,诉求也很简单,那就开始做吧。

我在 2020 年刚开始开发第一版的时候,其实同类型产品(我能搜索到的)还不算太多,跨平台的同时提供云同步的更是只有倒数日一款,再说倒数日的那个 UI 真的欣赏不能,但它免费,你还能说什么呢。

这款 App 在 2024 年推出,主要解决什么问题?

当时间来到了 2024 年之后,虽然在 iOS 平台上,跟我功能类似的产品已经非常多了,很多产品的 UI 和精致程度已经超过了我这款,但大部分产品是跟苹果平台强关联的,脱离 iOS 平台就无法使用了,这其实也是我第一款产品的问题,2021 年当我的苹果开发者账号到期之后,我预感接下来一年可能没时间继续开发这款产品,就没有续费开发者账号,于是你猜怎么着,之前曾经下载过我 App 的人,也无法使用 iCloud 进行数据同步了。。。苹果,你下架我的 App 我能够理解,但你直接禁止已经下载的用户使用 iCloud 同步这一点,就不太地道了吧。

所以我在对第一款产品升级的重点,就是要做一款长期主义的 App。

长期主义,贯穿这款产品开发始终

我做的时候,做一切决策,只考虑一个问题:这个 App 如何稳定使用 10 年,即使我已经不再做开发者,用户依旧可以正常使用?

云同步方式:Cloudflare D1

考虑到苹果 CloudKit 这个大坑,云同步肯定不能用了,更何况如果后期我要开发 Android 平台,更没发对接 iCloud,最开始我使用的是 fastify 框架,这样的话就要接数据库,就需要租服务器,这样的话,成本就非常大了。而当我接触到 Cloudflare D1,我就知道,我必须要用,这真的太棒了!

简单来讲,D1 就是基于 Api 的数据库服务,你只需要写好接口层的内容,然后交给 D1,一切就都就绪了,它不是一个实时运行的服务,但当你访问指定的路由时,D1 会根据路由找到指定的执行文件,执行后发给你执行结果。他有日 10W 的免费调用额度,5GB 的存储空间,对于一个记录和同步用户生日和纪念日的信息来说,绰绰有余了,即使后期用户群起来了(大概率不会),也可以通过简单的弹性套餐来增加调用次数和存储空间,这太适合低成本的 Startup 项目了!

本地存储方式:SQLite

同样的,自从被苹果 CloudKit 坑过之后,我算是 PTSD 了,其实如果我能继续使用 CloudKit 的话,那第一版 App 的大部分逻辑代码都能复用,我只用重新写写 UI 装饰一下就好了,但既然后期有 Android 版本,所以干脆在移动端就用 SQLite 了。

开发语言:SwiftUI && Flutter

其实在开发到一半的时候,Flutter 是一个更优解,因为可以一套代码多平台发布,但整个项目毕竟是从学习 SwiftUI 开始,所以也舍不得放弃当前已经构建了 80% 的 iOS App,所以下个产品,一定直接走 Flutter !

开发主要功能

BB 了这么久终于要说功能了

双历倒数日

中国生日用农历,所以肯定要兼容的,但结婚纪念日、恋爱纪念日这种,正常使用公历的当然也要支持。
V2RMB 商店截图
这里小小吐槽一下,SwiftUI 的 bug 真的奇奇怪怪的,他自带 DatePicker ,并且可以指定为 LunarCalendar,但不同的SwiftUI版本,在使用这个组件的时候,实际的展示效果千奇百怪,这种 bug 真的把我逼疯了,我只好自己做一个 LunarDatePicker。

多尺寸的小组件支持

同时支持苹果和安卓端的应用我知道的只有倒数日,但它的小组件真的一言难尽,所以这也是我打算开发多端的重要原因,希望我可以开发一款好看的安卓小组件吧~

多平台支持

如题,无须多言,国内备案实在是太恶心了,所以这款 App 近期不打算上架国区了,等以后再说吧。

多语言支持

如题,同样无须多言,因为使用的 XCode 工程标准的多语言支持方式,所以后期适配日语啊、德语啊,也是非常轻松的。

通知方式

作为一个以长期主义为主要宗旨的 App,云通知的方式是万万不行的(主要是云服务器计算压力比较大),那在 iOS 本地的 LocalNotificationSchedule 就非常香了,它是可以在本地预约通知的 Api,估计很多通知笔记都是经过这个 Api 进行开发的。

但我现在还不知道 Android 有没有类似的接口来实现(找到了,有方式实现),毕竟 Android 实在是太乱了。。。希望有吧。

下载地址

iOS端:App Store

Android端:新建文件夹中,可能需要一段开发时间。

收费吗?

只要用户量在当前 Cloudflare 免费调用额度以下,那就可以永远免费地使用下去,如果用户量激增(怎么可能),那就是早用早享受啦~