DevLog:2026年1月25日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

-设置-关于,DoitWith下面的小字和开屏上的小字是否一致?以设置-关于中的小字为准

-在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

-在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

-考虑到后续可能要和Mac版数据打通/同步(通过CloudKit,两个App绑定同一个iCloud Container),趁早将应用的数据持久化方式由Core Data改成SwiftData,和DoitWith for Mac的数据持久化方式保持一致,仅外观设置使用UserDefaults保存

-当天到期的Todo,早上九点推送通知

-添加小组件,小组件上显示当天到期的Todo,信息包括所在分组、标题、下一步

2.DoitWith for Mac

-调整新建分组、添加和编辑Todo窗口的视觉效果,部分图标和文字太小

-设置-关于页面下方增加“近期更新”区域,由Cursor总结近期更新了哪些功能

3.ChatWith

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,可以看到思考内容区域,但看不到具体的思考内容

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

-参考链接引用10条,参考链接区域默认折叠,可展开

4.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

2、近期的重点在于对齐移动版和Mac版的现有功能,修复明显问题,首先是DoitWith移动版,将数据持久化方式由Core Data改成SwiftData,步骤包括创建SwiftData模型文件,更新PersistenceController.swift、更新TodoData.swift、更新所有视图文件,删除旧的Core Data文件,修改过程中发现虽然Composer 1模型的修改速度非常快,但修改后出现多个语法错误,未能自动检测出来

3、接下来测试功能,让Cursor修复问题,首先是待办页的空状态提示,“暂无任务”改成“暂无待办”,“添加任务开始使用”改成“添加待办或分组以开始使用”,另外待办页无待办时,这些文字上方会显示一条分割线,需要去掉,出现分割线的原因是,以前在无待办时,List里仍有一个底部占位Section(Spacer高度200),该Section上方会出现分割线,修改之后,仅在有待办或分组时显示底部占位Section

4、然后测试添加、完成、修改、删除、搜索Todo和分组,测试发现问题如下:

1.不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

2.在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

3.在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

5、之前遇到过的同一分组内的Todo无法通过拖动调整顺序的问题,这次测试未能复现,可能在修改数据持久化方式之后也给解决了?

6、继续优化ChatWith移动版,主要针对之前测试遇到的问题,包括:

1.在与支持深度思考的模型对话时,现在可以看到思考内容区域,但看不到具体的思考内容,只能看到“思考中…”的提示

2.用户发送消息后,需要立刻显示在对话界面内,现在好像是在AI有响应后才会显示

3.虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

4.参考链接引用由5条加到10条,并且参考链接区域默认折叠,可展开

7、首轮修改之后,上述问题只有4已经被修复,换用内置的Kimi K2试一下,卡在分析问题的过程中,等了一段时间也没有对代码进行实际的修改,然后切换到Composer 1,修改速度很快,并且解决了“看不到具体的思考内容”、“回答内容未结合Tavily搜索结果”的问题,再次测试,要求进行如下修改:

1.思考内容区域要整合到AI消息区域中,即 最上面是思考区域(如果支持深度思考的话),然后是回答内容、参考链接,并且这三块要对齐

2.用户问题发送之后,对话界面应该立刻跳到新问题的位置,现在好像还需要手动往上划一下才能看到?

8、再次测试,上述问题好像也已经修复,但应用非常卡顿,可能是添加了太多调试信息导致的,后面再去掉,先继续用Composer 1尝试修复“清除后台后,再打开应用秒闪退”的问题,这次修改涉及生命周期管理、错误回复、超时保护、友好错误提示等,再次测试,应用直接无法正常启动了,要求Cursor清理所有的调试信息,并检查语法错误,首次启动速度是快了一点儿,但依然没有解决清除后台后无法启动的问题

9、决定换个思路,在ChatWith for Mac的基础上,适配一个iOS版,先让Curosr评估了下,首先,核心业务逻辑100%兼容,且有部分Flutter依赖已支持iOS,需要适配的部分包括部分原生平台代码、UI布局、几个macOS平台的特定功能(比如拖拽、粘贴、word文档和PDF文档解析),Cursor给出了完全兼容(使用条件编译和抽象层)和最小化适配两个方案,决定采纳方案1,希望这样可以减少后续对单独某个功能在Mac和iOS端的重复修改

10、由于存在代码隔离机制,macos和ios是独立的目录和Xcode项目,另有lib统一管理两个平台共用的代码,在后续测试时需要打开.xcworkspace文件,而非.xcodeproj文件,并且在修改共享的代码时要注意平台兼容性

11、分析的很简单,但实际操作时反复出错,比如因为权限问题不能创建项目文件,因为网络问题不能运行pod install等等,按照Cursor提供的文档手动创建项目后,又提示创建的项目不正确,反复修改了一段时间,仍未能修复

12、使用Cursor中的Codex插件检查该版本iOS应用的构建失败问题,几次修改后可以正常构建,但同样出现了ChatWith移动版存在的“清除后台后再打开应用秒闪退”的问题,结合Device Logs,Codex认为可能是一些依赖导致的崩溃,于是先暂时将其在iOS上禁用,避免启动时注册崩溃,多次修改后依然未能解决,而且基于ChatWith for Mac修改的iOS版应用在界面上还是Mac版的样子,完全没有适配移动设备,可能将使用Flutter开发的桌面版应用改为移动版并没有Cursor说的那么简单

13、用Codex,结合Device Logs检查一下“清除后台后再打开应用秒闪退”和首次打开时启动速度很慢的问题,也进行了多次反馈和调整,甚至还暂时去掉了可能导致崩溃的SwiftFlutterSecureStoragePlugin,即flutter_secure_storage依赖,但还是不管用

14、换个思路,从应用的首次启动速度入手,Codex加上了首屏耗时分析,包括First frame: startup=26145ms build=7611ms raster=11ms total=8631ms,针对这一问题进行多次修改,包括把启动阶段的初始化拆到首帧后执行、把设置读取和服务配置的初始化延后到首帧之后、把原生启动页改成橙色背景+标题和副标题以跳过白屏、去掉启动阶段的首帧调试输出等,首屏耗时变成了flutter: First frame: startup=18011ms build=4065ms raster=5ms total=4074ms

15、然后按照Codex的建议,删除App,运行flutter clean、flutter pub get,再重新构建,解决构建错误等等,首次启动可以正常启动,但启动速度比之前更慢了,而且清除后台后无法启动的问题依然存在,后面还得继续修改

DevLog:2026年1月23日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-按住拖动调整排序的功能无法正常使用

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

-设置-关于,DoitWith下面的小字和开屏上的小字是否一致?以设置-关于中的小字为准

-在Todo页面,没有“下一步”的Todo,在标题下显示“仅此一步”

-在已完成Todo页面,有下一步的Todo,在标题下显示“包含下一步”,没有“下一步”的Todo,在标题下显示“仅此一步”

-考虑到后续可能要和Mac版数据打通/同步,趁早将应用的数据持久化方式由Core Data改成SwiftData

2.ChatWith(目标是对齐ChatWith for Mac)

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别(两轮修改后已有思考内容区域,但看不到具体的思考内容)

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

3.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

4.DoitWith for Mac

-询问并调整数据持久化方式,Core Data改为SwiftData

-增加新Tab:已完成Todo,集中显示已完成的Todo及所属分组,放到现有的待办事项下面,待办事项Tab更名“所有Todo”

-界面优化,以卡片形式呈现每条Todo和Todo分组,并且“全部Todo”和“已完成Todo”界面效果一致

-增加“下一步”功能,和DoitWith移动版采用相同的完成Todo逻辑

-增加图标,使用DoitWith移动版的图标底图

-统一管理版本号,当前版本为v0.1.0

-调整新建分组、添加和编辑Todo窗口的视觉效果,部分图标和文字太小

-清理可能的残余文件

-结合当前应用的功能刷新一下README.MD

-设置-关于页面下方增加“近期更新”区域,由Cursor总结近期更新了哪些功能

2、首先调整DoitWith for Mac的数据持久化方式,使用ChatGPT建议的SwiftData,并且明确不需要“首次打开自动迁移历史数据”的机制,修改过程涉及创建SwiftData模型、更新DataManager、配置ModelContainer、更新所有Views、更新ViewModels、清理旧代码等

3、在构建测试之前先进行了一些清理,比如询问还有哪些数据在使用UserDefaults?还有没有需要清理的AI对话、笔记相关功能的代码?Cursor检测后删除了不再使用的InterfaceSettings.swift、ResizableHSplitView.swift以及DoitWith.xcdatamodeld目录(其中仍有AI对话和笔记相关的实体),并移除了项目文件中的引用,目前仍在使用UserDefaults的仅剩AppearanceManager.swift,来存储外观模式设置

4、接下来构建测试,首次构建失败,先让Cursor检查有没有语法问题,为啥总是会反复出现这种问题呢,我之前已经明确要求了修改后要自动检查是否有语法问题,难道这种要求也只针对当时所在的对话生效,而不是全局生效?在没有反馈Xcode构建错误信息的情况下,让Cursor检查是否有语法问题,修正了Preview代码缺少参数、SwiftData Predicate关系比较问题、以及清理未使用的代码,涉及8个文件

5、再次构建测试,可以正常启动且无构建错误,接下来先进行如下修改:

1.将现有的“待办事项”Tab改名为“所有Todo”,增加新Tab“已完成Todo”,放在“所有Tab”下面

2.已完成Todo里集中显示已完成的Todo及所属分组,和“所有Todo”界面版式一致,分组所在栏宽度固定300,无需新建分组和新建Todo按钮

3.设置-数据管理页面,去掉数据操作和导出数据、导入数据按钮

4.设置-关于页面,去掉“待办事项管理工具”和“一个专注于待办事项管理的应用”,在DoitWith下增加一行“Manage things with next steps”

6、针对上述需求,Cursor创建了CompletedTodoListView、CompletedTodoGroupListView、CompletedTodoItemsListView三个视图文件,组合成“已完成Todo”页面,并且更新了项目文件,构建成功,需求达成

7、继续修改,接下来是界面显示效果的优化,以卡片形式呈现分组和每条Todo,卡片可以有细边框和阴影效果,并且在“所有Todo”和“已完成Todo”两个界面使用同样的卡片效果,针对这一需求,Cursor创建了CardStyle.swift,提供统一的卡片样式ViewModifier,并具备细边框、阴影效果、圆角,以及选中状态高亮等特性,两个界面样式一致,构建测试后感觉基本达成需求,不像之前那样简陋了

8、优化一下最左侧栏和设置列表的显示效果,现在有点简陋,而且现在文字太小了,稍微改大一点,把“所有Todo”改成“全部Todo”,构建测试发现效果加的有点过了,而且还有很多界面上的细节需要调整,一并要求Cursor:

1.去掉界面右上角DoitWith下面的小字,缩小一下DoitWith的字号

2.最左侧栏的“全部Todo”、“已完成Todo”、“设置”,减小选中时的色块高度,稍微缩小下字号

3.最左侧栏宽度调整为200,去掉分隔线

4.搜索图标和文字,与调整后的导航列表另外三项的图标和文字大小一致

5.加大搜索弹窗,现在太小了

6.设置列表不再使用灰色作为底色,与其他页面的列表页底色一致

9、本轮修改去掉了界面右上角的DoitWith,将导航列表的宽度、字体大小、字重、间距统一,搜索弹窗尺寸由400*300加大至600*500,设置列表移除了灰色背景,再次构建测试,顺眼一些了,但设置列表仍然使用了灰色作为底色,检查一下还有哪里限定了这个界面的底色,再次修改后需求达成

10、接下来是添加图标,和统一版本号,在让Cursor检查并统一版本号(统一从Bundle中读取版本号,而不是硬编码)的同时,让ChatGPT基于DoitWith移动版图标的底图制作了DoitWith for Mac的图标包,参考以往的方法把图标包(含Contents.json文件)复制到对应路径后,出现了“The app icon set “AppIcon” has 10 unassigned children.”的错误提示,经Cursor检查这是因为缺少了“idiom”:“mac”字段,而它是macOS AppIcon配置的必需字段,将该字段添加到所有图标条目后问题解决,图标也已OK

11、发现两处可能是前面修改时的遗留问题,比如Assets.xcassets中有一个LaunchScreenBackground.colorset文件夹,另外还有一个NoteWith文件夹,里面包含了一些文件夹和文件,不知道是否有用,Cursor检查后认为,这两个文件夹都已无用,前者是iOS App的启动界面背景(移动版转为Mac版的残余),后者是改名DoitWith之前项目的残留文件,统一删除

12、接下来是给Todo添加“下一步”功能,具体需求包括:

1.在添加和修改Todo时,可以给Todo增加多个“下一步”,默认显示三行“下一步”,用户可以自行增加更多“下一步”

2.如果一条Todo未添加“下一步”,点击完成按钮时就直接完成整条Todo,如果添加了“下一步”,点击完成按钮时就完成下一步,所有下一步均完成后,才会完成整条Todo

3.加高每条Todo的卡片,除了现有的内容外,在标题下增加一行“下一步:下一步的具体内容”,如果没有下一步,这行就显示“仅此一步”

14、本次修改涉及文件较多,首先创建了NextStep模型,并修改了添加Todo界面、编辑Todo界面、Todo卡片显示、完成逻辑,同时更新了搜索窗口、回收站视图等位置,共修改了14个文件,自行检查语法错误并修正后,构建成功

15、然后构建DoitWith for Mac,测试增、删、改、查的全流程,对该功能进行微调,同时调整下搜索弹窗

1.包含下一步的Todo,在完成后,卡片上的标题和截止日期之间需要显示“包含下一步”,这样可以保证已完成的Todo卡片高度一致

2.搜索界面右下角需要增加“完成”按钮,点击可关闭搜索弹窗

3.搜索界面中的条目无需显示创建时间

16、上述修改涉及TodoItemsListView.swift和SearchWindowView.swift两个视图文件,构建测试,需求已达成,接下来开始陆续优化界面效果,首先是新建分组的弹窗,最上面的“新建分组”标题和右侧的“取消”、“添加”按钮太靠上了,显得界面很拥挤,可以看一下新建待办事项的弹窗顶部的效果是怎样实现的

17、结合文字描述和截图,Cursor经过多次修改,包括给新建分组弹窗的顶部设置了明确的间距,拉大弹窗尺寸等,但这个弹窗的标题和右侧按钮的显示总是不正常,明确要求对比这两个文件(右键——Add File to Cursor Chat)后,得知AddTodoView使用了ScrollView包裹内容区域,内容从顶部开始,而AddTodoGroupView使用的是Vstack,内容较少时会在垂直方向居中,修改方法是给AddTodoGroupView的内容区域添加ScrollView,与AddTodoView一致,再次测试,需求达成

18、今天的最后一个修改:结合当前应用的功能刷新一下README.MD,并且删掉PROJECT_STRUCTURE.MD文件

DevLog:2026年1月22日

1、截至目前,四款应用问题如下,加粗内容暂未修复:

1.DoitWith

-首次启动应用时无需生成示例数据

-设置-已完成 Todo,数据统计不正确

-已完成Todo页面同样以分组形式显示,需要能看到Todo原本所属的分组

-已过期的Todo需要在显示上有所差异,比如标题用红字

-设置-关于卡片最下方增加版本号信息,先用v0.1.0,居中显示

-按住拖动调整排序的功能无法正常使用

-不包含任何Todo的分组下会显示“该分组暂无待办”,但底下还有半截分隔线,需要和正常的Todo条目下的分隔线格式一致

2.ChatWith(目标是对齐ChatWith for Mac)

-清除后台后,再打开应用秒闪退,无法使用

-在与支持深度思考的模型对话时,看不到思考内容,我需要增加一个展示思考内容的区域,默认折叠,可以点击展开,并且显示样式要和回答内容有所区别(两轮修改后已有思考内容区域,但看不到具体的思考内容)

-发送消息后立刻显示在对话界面内,现在好像是在AI有响应后才会显示

-虽然可以看到Tavily已经联网获取了一些链接,但AI回答内容好像没有结合Tavily搜索结果

-不要给所有填写了Tavily Key的模型自动开启联网搜索功能,改为由用户自行开启/关闭联网搜索功能

-发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧放竖向排列的联网搜索开关和发送按钮

-对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

-参考链接区域版式优化,目前的链接间距太近,想点开某条时容易点错

-点击对话界面右上角弹出选择模型界面,每个模型的信息分成四行,备注、模型名称、是否支持联网,是否支持深度思考

-长按消息(包括用户消息和AI消息)可弹出菜单,菜单中包含复制、收藏、删除 三个按钮,其中在AI消息上长按点删除时要同步删除思考过程、回答内容和参考链接

-消息(包括用户消息和AI消息)的时间显示有问题,现在只显示时:分,看不到是哪天,当天的消息可以只显示时:分,最近的消息显示昨天、前天、几天前,较早的消息显示完整日期+时:分

3.ChatWith for Mac

-关于页面的“初始版本发布”放到最上边

-优化上传附件和图片后的显示效果,比如取消附件和图标的红叉需要改小一些

4.DoitWith for Mac

-询问并调整数据持久化方式

-界面优化,以卡片形式呈现每条Todo

-增加“下一步”功能,和DoitWith移动版采用相同的完成Todo逻辑

2、继续优化ChatWith,之前遗留的几个问题暂时搁置,本轮修改主要针对以下几点:

1.不要给所有填写了Tavily Key的模型自动开启联网搜索功能,改为由用户自行开启/关闭联网搜索功能

2.发送按钮上方设置联网搜索开关,并调整布局,拉高消息框,右侧放竖向排列的联网搜索开关和发送按钮

3.对话列表中显示的标题是用户的第一个问题,需要改为用户的最后一个问题

4.参考链接区域版式优化,目前的链接间距太近,想点开某条时容易点错

5.点击对话界面右上角弹出选择模型界面,每个模型的信息分成四行,备注、模型名称、是否支持联网,是否支持深度思考

3、Composer 1模型的修改速度一流,涉及了五个文件,连接真机测试,1已实现,2消息框的高度没有变,可输入区域还是只有一行,右侧已有联网搜索开关,3对话列表里的标题已可显示用户的最后一个问题,但点开对话之后顶部的标题还是第一个问题,需要统一成最后一个问题,4参考链接之间的间距可以适当缩小一些,5已实现,另外在设置-模型管理界面,每个模型的信息也和刚刚修改的选择模型界面一样分为四行:备注、模型名称、是否支持联网、是否支持深度思考,继续让Cursor修改

4、本次修改Cursor针对消息框设置了最多5行的显示高度,设置了最大高度为120,对话列表和对话页面标题保持一致,将参考链接间距由上次修改的12改为8,并且调整了模型管理页面,与模型选择界面保持一致,真机测试,其他问题都已解决,但输入框仍然只显示为一行,另外再调整下添加模型和编辑模型页面,现有的五个字段都必填,并且把“备注”挪到最前边,提示“起个简单好记的名字吧”

5、针对添加模型和编辑模型页面,Cursor在调整字段顺序的同时,给备注、API Key、Tavily Key字段添加了必填验证,不过Tavily Key字段其实不用必填,再次改了下,针对输入框的高度,截了一张ChatWith for Mac的输入框的图,并让Cursor参考调整了输入框的高度,但测试发现依然未能实现想要的效果,决定将联网搜索按钮从目前的位置挪出来,浮在输入框的上方,居左显示,带有提示文字,另外,在添加模型和编辑模型界面,备注字段的输入框高度和其他几个字段高度保持一致

6、再次真机测试,需求已实现,继续优化,除上述未解决的问题之外,在对话界面还要增加如下功能:

1.长按消息(包括用户消息和AI消息)可弹出菜单,菜单中包含复制、收藏、删除 三个按钮,其中在AI消息上长按点删除时要同步删除思考过程、回答内容和参考链接

2.消息(包括用户消息和AI消息)的时间显示有问题,现在只显示时:分,看不到是哪天,当天的消息可以只显示时:分,最近的消息显示昨天、前天、几天前,较早的消息显示完整日期+时:分

7、测试发现上述需求已实现,发现回收站还有一个问题,目前设置-回收站-收藏内容里会显示我删除的每一条对话内容,这里应该只显示我删除的收藏内容,经过一次修改后我才注意到,每条收藏只有复制、取消收藏两个选项,点取消收藏后,这条内容就会从收藏列表消失,不会进入回收站,需要将“取消收藏”改成“删除”,点击即进入回收站-收藏内容里,并且可恢复到收藏列表、可永久删除,这样才合理,在修改过程中,Cursor出现了反复使用同样的命令行的循环,打断之后虽然出现了构建错误,但再次反馈问题并重新生成代码、运行pod install之后,应用可正常构建,并且删除收藏/恢复收藏的需求也已达成

8、发现真机测试的效率真的比模拟器测试要高很多,而且更符合真实的使用场景,毕竟在Mac上用鼠标操作iOS应用还是不太符合使用手机的习惯,而且模拟器和手机的性能表现也很不一样,在模拟器上有些卡顿的功能,在真机上使用却会很流畅

9、然后将ChatWith for Mac的模型服务商列表截图给Cursor,让它给添加模型和编辑模型界面增加常用的提供商,实现自动填充Base URL的功能,同时保留自定义选项,可以手动输入Base URL,修改之后替换了下百度云千帆的链接,此需求已达成

10、然后是设置-数据统计页只需要保留AI对话和收藏内容两个卡片就行,不要再套一层卡片(外层Card包装),另外设置页底部增加一个“关于ChatWith”卡片,大字显示应用名“ChatWith”,第二行小字“Any AI LLM you like.”,第三行是版本号“v0.1.0”,这三行信息都居中显示

11、至此ChatWith的修改暂告一段落,继续修改DoitWith,需求包括:

1.首次启动应用时无需生成示例数据

2.设置-已完成 Todo,数据统计不正确

3.已完成Todo页面同样以分组形式显示,需要能看到Todo原本所属的分组

4.已过期的Todo需要在显示上有所差异,比如标题用红字

5.设置-关于卡片最下方增加版本号信息,先用v0.1.0,居中显示

12、也用Composer1模型进行修改,修改点包括修改TodoData.swift以移除自动创建示例数据的逻辑,修改SettingView.swift中的统计逻辑,修改CompletedTodosView.swift以按分组显示已完成的Todo,修改TodoRowView.swift和GroupTodoRowView.swift以添加过期检查逻辑,修改SettingView的关于部分,之后开始真机测试,上述需求的2、3、4、5均已实现,1可能需要在另一台手机上测试

13、然后检查一下目前应用都在哪些地方规定了版本号,可否只在一处填写版本号,在其他地方调用该处的版本号信息?针对这一需求,Cursor创建了AppConfig.swift文件来集中管理应用配置信息,规定了版本号优先从Bundle读取(Xcode项目中的MARKETING_VERSION),如果无法读取则使用默认值“v0.1.0”,同时提供了构建版本号的读取方法,然后将刚刚增加的设置-关于板块的硬编码版本号改为从项目配置中读取,这样就实现了版本号只在一个地方定义,并自动同步到使用版本号的地方

14、不止一个地方提到了“版本号”和“构建版本号”两个概念,询问了下ChatGPT,简单说就是版本号Version是给用户看的,构建版本号Build是给系统/开发者/审核看的;版本号表示产品层面的版本,如果用三位数(比如1.0.1)的话,三位数分别代表主版本号、次版本号、修订号,分别对应大版本、功能更新、Bug修复,构建版本号表示技术层面的“第几次打包”,每打一次包,就应该不一样,同一个版本号,对应的构建号必须递增,且不能重复;举例说,日常开发版本号可能是1.0.0+1,有功能更新时版本号可能是1.1.0+10,大版本发布时版本号可能是2.0.0+1,后续可以按照这种方式来管理版本,更加规范一些

15、针对DoitWith for Mac的数据持久化方式,首先让Cursor检查了下,受到以前有AI对话和笔记板块的影响,目前实际使用的是UserDefaults+JSON编码(TodoItem和TodoGroup通过JSON序列化存储在UserDefaults,每次修改都会序列化整个数组并保存),CoreDataManager已经初始化但实际未使用,而且数据模型中还保留着已经删除功能的实体(AIMessage、AISession、AIModel、Note);目前存在的问题有些多,比如Core Data已经初始化但未使用,造成资源浪费,数据模型包含已删除功能的实体,需要清理,UserDefaults不适合存储大量结构化数据,性能较差,每次保存都要序列化整个数组,数据量大时会有性能问题

16、针对上述问题,Cursor建议了三个方案,一是完全移除Core Data以简化架构,减少资源占用,降低维护成本;二是迁移到Core Data,性能好,支持大量数据,支持复杂查询/排序/过滤;三是使用SwiftData,具备更现代的API,与SwiftUI集成更好,代码更简洁,可自动处理数据同步,ChatGPT强烈推荐使用SwiftData(苹果在WWDC23推出的Core Data现代化封装,语法极简,学习成本低),认为它能最大化开发效率,同时不牺牲未来扩展性,让待办类工具使用Core Data有些“杀鸡用牛刀”,决定采纳ChatGPT的建议,使用SwiftData

17、Cursor认为TodoItem、TodoGroup这种业务数据可以使用SwiftData,界面设置和外观设置等配置数据可以继续使用UserDefaults,明天按照Cursor的建议修改下DoitWith的数据持久化方式,后续DoitWith移动版也考虑将Core Data换成SwiftData,ChatWith和ChatWith for Mac已经使用Flutter重制,不涉及Core Data或SwiftData