DevLog:2025年8月29日

1、首先让Cursor把深度思考内容的底色换成浅灰色,目前的颜色在AI对话界面中略显突兀,因为提问和回答内容都改成了白色
2、需要继续优化AI回答内容的Markdown渲染效果,渲染后的内容能否不以空格替代语法占的位置?比如加粗的文字前后都有两个空格,Cursor表示在Markdown样式应用的过程中,代码使用了NSColor.clear来隐藏语法标记,但这只是让语法标记变透明,并未真正移除它们占用的空间,需要用字符串替换来真正移除语法标记
3、但测试发现使用字符串替换的效果不好,回答内容被截断,且原本使用了同一个Markdown语法的内容,部分文字有渲染效果,部分没有,尝试用属性应用而不是字符串替换,一顿操作之后,又回到了之前的效果,渲染后的内容还是以空格替代了语法标记占的位置,又是一个悬而未决的问题
4、如果改用SwiftUI的Text来渲染AI对话内容,会失去文本选择功能、失去右键菜单、文本搜索等高级文本交互功能,Markdown渲染也会有限制,还是继续保持目前的NSTextView吧
5、发现在AI对话列表中点击右键修改标题时会弹出弹窗,可以在弹窗里输入新标题,但弹窗上方一直有一个空的icon,之前也修改过多次,但删不掉,于是要求改成点击右键修改标题,直接在对话标题位置修改、回车确认,修改过程中发现AIChatSessionListView和AIChatView在功能上有一些重叠,Cursor分析后发现AIChatSessionListView没有被使用,AIChatView中包含了了会话列表和聊天功能,于是决定把会话列表相关功能从AIChatView中迁移到AIChatSessionListView里,这样更便于后续对聊天功能和列表功能进行分别管理,然后修正了导航栏消失、部分界面变成四栏布局等问题
6、接下来需要统一一下AI对话列表和AI对话之间、备忘录列表和备忘录详情之间的分割线样式、底色样式,选中样式,以及拖动调整比例的功能,在实现这一需求的过程中,将ContentView中有关AI对话列表功能完全移动到了AIChatSessionListView中,这下ContentView就只专注于导航和界面切换了,减少了跨组件的状态传递,符合单一职责原则
7、然后统一了两个列表的默认宽度(最小200、理想300、默认300、最大400)和样式(首次打开和切换时不选中任何一条内容、每个条目都不需要用圆角,翻译一下,正确的说法应该是移除自动选中和圆角设计)
8、发现在Views/Notes/Components文件夹下有两个文件,SearchBarView和EmptyStateView,但不知道这两个文件现在还有没有用,这是之前使用UserDefaults来存储数据时,Cursor拆分的组件,现在NotesListView里已经有了重复的组件,SearchBarView用于在备忘录中搜索内容,EmptyStateView是空状态显示组件,Cursor建议删掉这两个文件,我觉得目前这俩文件好像也没啥用了,甚至这两个文件都没有被项目文件引用,删完之后项目结构更加整洁了
9、AI对话和备忘录列表修改告一段落之后,我又开始看待办事项分组列表,询问Cursor后发现这个列表不是单独的文件,是TodoListView文件的中的一个组件,并且备忘录界面使用了HSplitView,可调节宽度,待办事项界面使用了HStack,固定布局,虽然备忘录分组管理的功能完整,但界面布局和AI对话、备忘录列表不一致,还是决定以后要改成一致的

DevLog:2025年8月25日

1、接下来优化文字选择相关功能,我的目标是可以选择AI对话内容中的部分文字,测试发现目前的NoteWith在选择AI对话内容的部分文字时,无法同时选择掺杂了了不同Markdown语法的内容,比如同一行文字里如果既有加粗的文字也有普通文本,就无法选择,如果这一行文字只有H3或者普通文本,就可以选择
2、Cursor理解了我的需求,但没完全理解,它还在延续上周对备忘录功能的修改,表示当前的WYSIWYG Markdown编辑器通过隐藏Markdown语法标记(将颜色设置为透明)来实现视觉效果,这回导致文本选择问题,因为不同的Markdown语法被分割成了不同的文本片段,于是Cursor主要修改了NoteEditView文件,改进了文本视图配置、添加文本存储代理、实现NSTextStorageDelegate、改进选择范围处理,测试发现备忘录中的内容的确可以跨行、跨语法选择了
3、但其实我是想让Cursor处理AI对话中文字内容无法跨Markdown语法选择的问题,在和Cursor明确后,它修改了MarkdownWithCodeBlocksView(其中使用NSTextViewWrapper来渲染各种Markdown元素),创建了新的ImprovedMarkdownTextView(实际名字是OptimizedMarkdownTextView),使用单个NSTextView来渲染整个文本内容,并删除旧的MarkdownLineView结构,修改过程中甚至还直接删掉了整个MarkdownWithCodeBlocksView,因为Cursor觉得它太复杂了?
4、Cursor重新创建了MarkdownWithCodeBlocksView,让整个Markdown内容在一个NSTextView中,但实测发现AI对话内容无法正常渲染,且应用非常卡顿,在不同对话间切换时甚至会卡死,原因可能是过多的调试输出、复杂的正则表达式处理、频繁的文本存储更新、重复的样式应用等,之后测试时发现AI回答内容无法正常渲染,有的看不到任何回答,有的会显示在一个小框里,没有展开显示,不过现在已经可以跨语法选择了,还是有成果的
5、截了多张AI回答以小框显示的图给Cursor之后,它判断可能是NSTextView的高度没有正确设置,需要让NSTextView能够根据内容自动调整高度,修改一轮之后问题依然存在,甚至还差一点就给我替换成SwiftUI的Text视图,赶紧拦住,后面重开一个对话再修改这个问题吧

DevLog:2025年8月16日

1、今天抽空优化应用功能和界面,首先是和导航栏的问题:我在首页选择了模型之后开始对话,但好像无论我选不选,都会跟模型列表里的第一个模型对话,而且我选择模型之后首页也看不到我选了哪个模型;另外左侧导航栏和图标和文字好像都没有对齐,我需要让图标和文字都左对齐
2、针对导航栏图标和文字不对齐的文字,Cursor进行了多次修改,包括将List改为VStack、给按钮添加背景颜色、点击区域等等,修改过程了再次出现了“ContentView文件结构被破坏,让我重新创建这个文件”的提示,可能是因为调整了中间的某行代码,但没有找到对应的闭合大括号导致的,这个问题近期遇到了多次,当然在修改过程中也没有全部重写ContentView,只是重写了其中的一部分
3、导航栏的问题还在修改中,由于首页和其它页面使用了不同的布局结构,导致样式难以统一,Cursor表示最好的解决方案是将所有的页面统一使用NavigationSplitView,这样可以确保样式完全一致,并且首页也可以有导航栏收起按钮,但不知道这样是否会导致首页变成三栏,先改一下试试看
4、果然在这次修改后首页也变成了三栏,但第二栏真的没有什么用,既然多次修改都暂时不能达成需求,且首页更多的是品牌展示的作用,决定先去掉首页模块,重点把其它界面的功能补齐,体验做好
5、首先就是优化AI对话输入框,将输入框加大、加高,并且使用圆角,以及对导航栏五个按钮的点击区域进行优化,让整行都可以点击,Cursor在修改时多次加高了导航栏按钮的高度和输入框的高度,依然没有解决问题,特别是输入框,只有我输入的内容足够多时才会变高,平时仍然是窄窄的一小条
6、通过将TextField替换为TextEditor,解决了输入框只有一窄条的问题,但底部的附件和发送按钮和底部边缘之间没有任何间距,甚至发送按钮都被遮挡了,反复调整多个边距数据终于达成需求,按钮不被遮挡,输入框的高度足以显示多行内容,且有圆角
7、然后调整了AI对话界面我的头像的位置,改成与消息气泡的顶部对齐,之前有些太靠下了
8、接下来优化AI对话的内容的滚动问题,让打开对话时自动滚动到最近的消息,同时给选中的对话增加一个选中状态的视觉反馈,Cursor通过增加双重滚动机制解决了前者,然后增加了浅蓝色半透明的选中状态,决定让Cursor将这一选中状态设计也应用到知识库、备忘录、设置列表中,视觉效果更统一一下,但设置列表由于采用了NavigationLink,本身就有内置的选中状态样式,再叠加了自定义的选中状态之后导致样式重叠,但NavigationLink内置的选中状态样式的确难看,于是让Cursor将NavigationLink替换为自定义Button组件,并且套用了自定义的选中状态样式
9、多次测试发现并没有统一消息的滚动机制,有时还会滚动到一半,先让Cursor改成了打开对话时跳到最近一次对话内容,然后增加对代码块的渲染,去掉长按消息后的弹窗,改成在消息底部增加收藏、复制、删除三个按钮,并具备对应功能,Cursor说针对代码块设计了明显的边框和背景,但在Xcode模拟器中测试时好像没有生效,再次让Cursor修改,并让代码块解析器能够识别更多类型的代码内容,然后又修复了几次代码识别识别逻辑(包含智能边界检测、全面的文字过滤、精确的代码识别等等),因为有些普通的回答内容也被包含在了代码块里,修改之后基本达成要求
10、预感现在AIChatView可能需要拆分了,因为目前包含了太多功能,于是询问Cursor是否有必要拆分该文件,Cursor认为目前的AIChatView文件过大、功能混杂,且有代码重复风险,并给出了拆分建议,先拆分代码模块,再拆分UI组件,最后优化主视图,决定让Cursor按照渐进式方案拆分
11、边拆分边测试,发现代码片段看不到代码块了,Cursor表示时在修复编译错误时失去了代码渲染功能,于是重新启用了代码块渲染,并且修改了项目文件,添加了新创建的文件,之后多次针对代码不能被正常渲染的问题修改CodeBlockParser文件,比如文字被判断成代码,代码中的注释被判断成文字,Swift代码被识别成Python代码等,多次修改之后Python代码和Swift代码的显示效果都能正常被包含在代码块中,且没有出现误判,Cursor添加的调试信息还是很管用的
12、现在AI对话页面的消息滚动效果没有统一(打开对话时有的对话会滚动到最近一条,有的对话会滚动到中间,有的对话会滚动到底部),询问Cursor目前是不是还有对浏览位置的保存机制(比如再次打开时会跳转到上次浏览的位置)导致滚动效果不统一,Cursor表示目前没有对浏览位置的保存机制,滚动效果不统一的原因可能是因为SwiftUI的渲染机制、动画延迟、消息数量差异等,然后再次修改AIChatView的滚动逻辑,结果是:统一滚动到最新消息、响应消息变化、避免滚动位置不一致、平滑的滚动动画,实际测试仍有部分对话没能直接滚动到底部
13、发现一个新问题,包含搜索结果的回答内容,底部不显示消息来源了,让Cursor检查问题出在哪里,检查发现AIMessage模型中有searchlinks字段,但MessageView缺少了搜索链接显示逻辑,修正之后,再统一了参考链接的显示宽度(是参考链接部分没有继承AI回答内容的宽度限制导致的宽度不一致)
14、AI消息相关的功能现在逐渐增多,接下来想让Cursor把MessageView从AIChatView中拆分出来,Cursor也认为应当拆分,以提升后续的代码可维护性,创建了新的MessageView文件,但又突然创建了脚本,想用脚本修改项目文件,被我叫停了
15、发现Cursor在拆分文件时经常出现类似的问题,在创建新文件后都需要将新文件添加到项目文件里,但有时Cursor会后退一步,不管新建的文件,而是选择在原有文件中恢复原本已拆分出去的功能,或者创建脚本,用脚本去修改项目文件(Cursor会先对项目文件做备份),当然可以叫停,让Cursor直接去修改项目文件
16、今天Cursor的Dashboard统计功能竟然正常了,可以看到从付费到现在的代码修改量,到目前为止已经编辑了50211行代码

DevLog:2025年7月31日

1、询问了Cursor如果要增强NoteWith对iPad的兼容性,需要做哪些调整,Cursor表示不需要单独开发一个iPad版本,因为SwiftUI提供了很好的跨设备适配能力,可以先使用SwiftUI的响应式设计,之后再涉及iPad专用导航结构,最后再添加拖拽、分屏等高级功能,这样可以实现大部分业务逻辑和服务层代码的复用,只需要维护一套代码,功能更新同时适配两个平台,且用户体验一致
2、而且有这样一个兼容iPad的应用之后,就不用再开发单独的Mac版本,可利用Apple提供的Mac Catalyst技术,将iPad应用转换为Mac应用,无需重写代码,只需在Xcode中启动一个选项,即可保持与iPad版本相同的功能和界面:在Xcode项目设置中选择项目target、在”General”标签页勾选”Mac Catalyst”选项,选择”Mac”作为部署目标
3、发现自己的对NoteWith的设想和腾讯的ima.copilot有点像,决定体验一下ima,参考它来丰富NoteWith的功能,知识库功能更
4、下一步,优化AI问答页面的显示效果,需要支持流式输出,不要等回答完了再一次弹出全部回答内容,如果模型支持深度思考,同样也要以流式输出来展现思考过程,且思考内容与回答内容样式要有所区别,比如思考内容用灰色文字,可折叠/展开,回答内容用黑色文字
5、这个问题看来有点难度,Cursor尝试了多种不同的解决方案,但成功搞定了,之后继续优化,跟Cursor说,有几个小问题需要优化下:1.回答内容右侧的收藏图标,等回答结束后再出现,不要还没回答就出现 2.回答内容貌似不支持Markdown,需要添加对Markdown的支持 3.对话详情页需要跟着回答内容的流式输出自动向下滑动
6、Cursor创建了MarkdownRenderer.swift,并且让我手动添加到Xcode项目中,但模拟器测试发现还是不支持Markdown渲染,另外两个需求已经实现了,继续让Cursor修正,修正一次后发现目前会同时显示Markdown语法和渲染后的效果,继续让Cursor修正,再修正一次后发现如果有文字同时应用多个Markdown语法,会显示一种渲染效果+一种Markdown语法标记,不会只显示渲染效果,继续让Cursor针对集中常见的Markdown语法组合做优化,比如标题+加粗、列表+加粗、引用+加粗,终于解决了这一问题
7、Cursor给出了修改思路:先处理块级语法,再处理行内语法,使用循环处理确保所有标记都被移除,如果找不到结束标记,会移除开始标记,同时避免无限循环和语法错误
8、下一步对备忘录列表和备忘录界面进行优化,设置默认格式,默认采用苹方字体,字体大小默认和AI对话输出的无Markdown语法的字体大小一致,增加对齐方式的选择按钮,选中文字后可设置居中、居左、居右、两端对齐四种对齐方式
9、Cursor完成上述需求后,继续对对齐方式的设置按钮、默认行间距、默认字体大小进行优化,之后让Cursor处理设置对齐方式时DEBUG信息中出现大量错误信息和应用崩溃的问题,目前问题仍然存在
10、下一步在模拟器中测试下,是调整对齐方式时会频繁报错甚至崩溃,还是进行其它操作时会频繁报错,以更精确的定位问题,让Cursor修改

DevLog:2025年7月16日

1、了解了下Cursor的订阅,虽然默认的Auto模式已经足以满足我的需求,但马上两周的免费试用期就要结束了,到时看看功能上有什么变化,如果功能严重受限,考虑订阅Cursor Pro,目前可以用支付宝支付
2、Cursor具备Agent、Ask、Manual、Background四种编程方式,可以根据需求选择,模型方面,Auto模式由Cursor根据任务类型和复杂程度自动判断使用哪个模型,也可以关闭Auto模式,指定模型
3、NoteWith和ChatWith由于涉及接入AI大模型,在上架时可能需要先备案,但备案手续复杂且审核时间长,考虑开发一款不需要进行备案的App
4、赶在Cursor的Pro试用过期之前,让Cursor再帮我开发一个新应用,吸取之前的教训,这次在一开始就提出了尽量详细的需求:
1.iOS平台,应用名称为DoitWith,采用SwiftUI开发
2.应用启动界面以墨绿色为底色,启动界面显示应用名DoitWith,下方一行为副标题“Todo and Note, in one App.”
3.应用界面分为Today、Todo、Note共三个tab,可在底部点击切换,三个tab的右上角都有加号和齿轮图标,Todo界面点加号可选择创建新Todo或创建新分组,笔记界面点加号可以创建新笔记,点击齿轮进入设置界面,Today列表、Todo列表和笔记列表的设计要足够简洁且风格一致一些
4.Today界面列出今天到期的Todo项目,可以长按每条Todo进行完成、重命名、修改、删除等操作
5.Todo界面可以自行设置组(默认有工作、生活两个分组,各有一条示例Todo)、可设置提醒时间,任务过期时文字变红并在文字前添加警告emoji,每条Todo都可以通过长按进行完成、重命名、修改、删除等操作,可将Todo在不同分组间拖动
6.笔记界面默认显示笔记列表,点击创建笔记按钮或笔记列表页右上角加号可创建笔记,采用富文本编辑器,支持常用的文字格式设置,选中文字后即可在底部调节格式
7.设置界面可查看Todo和Note的数量
8.采用你推荐的数据存储方式
5、Cursor对我的需求进行细化和明确,给出了技术选型与架构建议:
-UI 框架:SwiftUI(官方推荐,现代、易维护)
-数据存储:推荐使用 Core Data(苹果官方,适合本地结构化数据,支持分组、提醒、富文本等需求)
-富文本编辑:使用 SwiftUI + NSAttributedString,或集成第三方如 TextEditorPlus(如需更强大功能)
-本地通知:用于 Todo 提醒
-MVVM 架构:便于维护和扩展
以及任务拆解:
-项目初始化与启动页开发
-TabView 主界面搭建
-Today、Todo、Note 三个 Tab 的基本结构
-加号与齿轮按钮功能实现
-Todo 分组、拖动、提醒、过期样式
-Note 富文本编辑器集成
-设置界面开发
-数据存储(Core Data)建模与集成
-本地通知集成
-UI 优化与风格统一
6、Cursor让我在 Xcode 里手动新建一个 SwiftUI iOS App(建议命名为“DoitWith”,语言选择 Swift,生命周期选择 SwiftUI App,勾选“Use Core Data”),之后再进行后续操作
7、在Cursor创建应用的过程中,有两次需要我手动创建NSManagedObject Subclass,昨天在修改NoteWith时也出现了这种情况,猜测可能是因为在数据存储方面采用了Core Data
8、在集成富文本编辑器时,Cursor建议我使用RichTextKit的包管理集成,且Cursor无法自行完成这一操作,需要我在Xcode中Add Packages,集成RichTextKit,但我个人不太喜欢这种功能较为复杂的三方库,于是询问Cursor:有没有iOS自带的组件可以实现类似需求?我对这个编辑器的功能要求不是很高
9、Cursor推荐使用UIKit的UITextViews实现基础富文本编辑,然后通过UIViewRepresentable桥接到SwiftUI,这样无需引入第三方库,且兼容性和性能都很好
10、Cursor在创建完成后提示构建成功,但再次出现了昨天NoteWith的问题“可能有重复的NSManagedObject子类文件,或者Xcode项目引用了同一份文件的多份引用”,明天再看怎么解决

DevLog:2025年7月14日

1、今天对NoteWith做一些优化,包括:
1.去掉启动页面的图标,只留应用名和下面的文字就行
2.在模拟器中打开应用时,进入启动页前会有一两秒的白屏,需要去掉,打开应用直接进入启动页
3.在模拟器中运行应用时会有警告,需要修正一下:
/Users/jinlei.wu/Documents/GitHub/NoteWith/NoteWith/ViewModels/AIViewModel.swift:86:21 Capture of ‘self’ with non-sendable type ‘AIViewModel’ in a ‘@Sendable’ closure
2、修正后经Cursor构建和模拟器测试,上述优化均已完成,但还是感觉启动速度有些慢,继续让Cursor优化:感觉应用启动有点慢,虽然现在启动时没有白屏了,但还需要在蓝屏状态下等一两秒才会出现应用明和副标题
3、Cursor检测了当前的启动流程,发现SplashView会显示2秒钟,Cursor对这个问题进行了修正,并通过异步加载数据来减少启动时间,告诉我启动页显示时间由2秒缩短为0.5-1.2秒,并加入了淡入淡出动画,在启动时异步加载数据,主界面准备好后立刻切换,最大程度减少等待,Xcode模拟器测试发现冷启动时仍然会先蓝屏再显示标题和副标题,继续让Cursor优化
4、Cursor指出这是由于当前的启动页SplashView并没有在应用一启动时就立刻渲染,而是先显示了LaunchScreen,然后才切换到SwiftUI的SplashView,Cursor在修改中表示更好的方法是完全移除LaunchScreen配置,让应用直接进入SwiftUI,修改后构建测试成功,Cursor告诉我现在应用冷启动时会立即显示标题和副标题,无蓝屏过渡,直接显示内容,并且会快速进入主界面,数据加载完后立即切换,Xcode测试发现现在启动页面一闪而过,虽然给人一种快速进入应用的感觉,但不利于让用户记住这款应用的名字,决定将启动页面显示时长固定为1秒钟
5、Cursor快速修改,包括:简化启动逻辑,固定显示时间,清理不再使用的代码,但实际测试发现在冷启动时依然会先白屏,然后再显示启动页,不像ChatWith那样可以直接进入启动页,直接问Cursor:现在冷启动时还是会先白屏一下再进入启动页,为啥不能像ChatWith那样启动应用就直接显示启动页呢?
6、Cursor好像理解了我的问题(涉及两个项目之间的对比),并表示需要创建并配置Laucn Screen Storyboard文件,并对PBXFileReference等进行修改
7、Cursor一通操作之后又删除了刚刚创建的LauchScreen.storyboard文件,构建测试成功,再次用Xcode模拟器测试,好像没有任何的变化,应用启动时的表现又回到了今天最初的状态,可能是因为应用在启动时的数据加载要比ChatWith多吗?
8、直接问Cursor这个问题,Cursor表示NoteWith的确需要在启动时加载更多内容,并给出建议,比如将部分数据加载延迟到用户首次访问时,或者进行异步初始化,将数据加载移到后台线程,或者分页加载等等
9、参考Cursor的建议:延迟加载AI会话历史页面,当用户访问该页面时再行加载,以缩短启动时间,Cursor对多个文件进行了修改,将AI对话数据加载从初始化中分离,实现了备忘录数据和AI配置的立即加载,且仅在用户访问AI对话页面时加载AI会话历史,再次进行构建测试,提示成功
10、Xcode测试,好像启动速度的确比之前快了一点点,白屏时间缩短了一些,继续优化:把AI配置也改成延迟加载吧,和AI会话历史一样,仅在用户访问AI对话页面时再行加载。但我忽略了一点,用户在访问AI配置时当然也需要加载配置,但Cursor发现了这个问题,并且进行了同步修改,还是很智能的
11、Cursor总结,现在在启动应用时只加载备忘录数据,访问A对话页面时会加载AI会话历史和AI配置,访问设置页面时加载AI配置,实现了启动性能的提升和按需加载,减少启动时的内存占用,Xcode模拟器测试发现相比上一次修改没有特别明显的变化,后面等真机测试,积累一些数据之后再看看启动性能如何吧
12、用Cursor分别打开NoteWith和ChatWith,并询问同一个问题:你对目前这版应用有什么完善功能、优化性能的建议吗?
13、Cursor对当前版本的NoteWith的功能和性能方面的建议:
基于你目前对NoteWith的启动性能和数据延迟加载优化,整体架构已经非常合理,用户体验也有明显提升。以下是一些进一步完善功能和优化性能的建议,供你参考:
一、功能完善建议
多端同步与云备份
支持 iCloud 或第三方云服务(如 Dropbox、OneDrive)同步备忘录和AI会话,防止数据丢失,方便多设备协作。
搜索与筛选功能
在备忘录和AI会话列表中增加全文搜索、标签筛选、时间排序等功能,提升内容管理效率。
多主题/深色模式自定义
支持更多主题色彩和自定义深浅模式,提升个性化体验。
AI助手能力扩展
增加AI助手的多轮对话记忆、上下文理解、语音输入/输出等功能,提升智能化水平。
数据导入导出
支持导入/导出备忘录和AI会话为常见格式(如txt、markdown、csv),方便迁移和备份。
快捷操作与小组件
支持iOS主屏幕小组件、Siri快捷指令,提升便捷性。
二、性能优化建议
数据分页与懒加载
对于备忘录、AI会话等大数据量列表,采用分页加载或无限滚动,避免一次性加载全部数据。
本地缓存与异步存储
采用本地缓存机制(如 NSCache、Core Data),并将数据存储操作放到后台线程,避免主线程阻塞。
图片与多媒体资源优化
若后续支持图片、音频等多媒体内容,需考虑资源压缩、懒加载和缓存,减少内存占用。
启动流程进一步精简
检查启动流程中是否还有可以异步处理的逻辑,确保主线程尽快渲染首屏。
内存泄漏与资源释放
定期使用 Xcode Instruments 检查内存泄漏,确保大对象及时释放,避免长时间运行后内存膨胀。
三、代码结构与可维护性建议
模块解耦与协议抽象
通过协议(Protocol)和依赖注入解耦各模块,便于单元测试和后续扩展。
单元测试与UI自动化测试
增加关键功能的单元测试和UI自动化测试,提升代码质量和发布稳定性。
错误处理与用户提示
完善网络、存储等异常场景的错误处理,并给予用户友好提示。
如果你有具体想扩展的方向(如AI能力、协作功能、数据安全等),可以进一步细化需求,我可以帮你详细设计实现方案!
14、Cursor对当前版本的ChatWith的功能和性能方面的建议:
非常感谢你的信任!基于你目前的ChatWith应用(多会话AI对话、收藏、会话置顶、API配置、数据本地化、原生SwiftUI等),我有以下功能完善和性能优化建议,供你参考:
一、功能完善建议
消息搜索功能
支持在所有会话或当前会话内全文搜索历史消息,提升信息检索效率。
多模型/多API切换
支持在不同会话中选择不同的模型或API(如GPT-3.5、GPT-4、Claude等),满足多样化需求。
消息多选与批量操作
支持批量收藏、删除、导出消息,提升管理效率。
导出与分享
支持将会话导出为文本、Markdown或PDF,便于归档和分享。
自定义主题/暗色模式
增加主题切换,适配不同用户的视觉偏好。
消息撤回与编辑
支持用户撤回或编辑已发送的消息(本地层面)。
快捷指令/预设Prompt
提供常用Prompt模板,用户可一键插入,提升效率。
多端同步(iCloud/云端)
支持iCloud同步,实现多设备无缝切换。
更丰富的消息类型
支持图片、代码块、表格等富文本消息,提升交互体验。
消息上下文管理
支持设置会话上下文长度、历史消息截断策略,优化大模型调用成本。
二、性能优化建议
异步加载与懒加载
对长会话消息列表采用懒加载,避免一次性渲染全部消息导致卡顿。
本地缓存与数据归档
对历史会话、收藏等数据做分批加载和归档,减少内存占用。
UI渲染优化
使用LazyVStack、@ViewBuilder等SwiftUI高效渲染方式,避免不必要的重绘。
API请求超时与重试机制
增加网络请求的超时、重试和错误恢复机制,提升稳定性。
内存泄漏检测
定期用Instruments等工具检查内存泄漏,优化数据结构和引用关系。
启动速度优化
精简启动流程,异步加载非核心数据,提升冷启动体验。
三、用户体验提升
新手引导与帮助中心
增加首次启动引导页、FAQ或内置帮助,降低上手门槛。
交互动画与反馈
适当增加发送、收藏等操作的动画和提示,提升操作愉悦感。
无障碍适配
适配VoiceOver、动态字体等,提高可访问性。
如需对某一条建议详细展开(如实现思路、代码示例、UI设计等),请随时告诉我!
15、结合Cursor的建议,先对ChatWith进行优化:
结合你的建议,我需要为ChatWith增加如下功能:
1.增加消息搜索功能,搜索栏放在对话列表顶部,可以在所有会话的历史消息中进行搜索,无需保存搜索历史
2.对长会话消息列表采用懒加载,避免一次性渲染全部消息导致卡顿
3.使用SwiftUI高效渲染方式,避免不必要的重绘
4.在收藏消息时增加动画提示,提醒用户“收藏成功,可前往收藏页查看”
5.可长按收藏内容进行取消收藏、复制内容到剪贴板等操作,长按弹出的菜单提示“取消收藏”、“复制收藏”
Cursor对这些需求制定了实现方案,我要求“按你计划的步骤来开发吧,并且每步完成后都使用iPhone 16模拟器构建一下,先不用在模拟器中运行”,Curso开始逐条处理,中间需要多次确认,Cursor很快处理完成并提示构建成功
16、在Xcode模拟器中添加模型测试对话,提示服务器错误:HTTP 404,并且还有两处可以优化:新建对话的顶部不需要“已加载全部消息”的提示,优化一下会话列表的样式,可以改成无边框的卡片式风格,继续让Cursor修改,修改的效果也不是很理想,全部对话列表页的样式太丑了,目前每个卡片的长度是只比标题长一点儿吗?我需要即使标题特别短,卡片边缘也能到达屏幕左右两侧,另外,设置页面的API路径,有没有自动添加/chat/completions?继续让Cursor修改
17、404问题已解决了一部分,目前使用模型时需要在设置中填写不带/chat/completions的API路径,如https://api.deepseek.com/v1/,Cursor解释说实际请求的API路径时“你设置的baseURL+/chat/completions”,设置页面只需填写基础URL,不要带/chat/completions
18、经测试DeepSeek官方的API(API地址是https://api.deepseek.com/v1/)和火山引擎的API(增加了联网搜索能力之后的“应用”,API地址是https://ark.cn-beijing.volces.com/api/v3/bots/)均可正常使用,但OpenRouter的模型仍然会报错404,即使API路径只填写了https://openrouter.ai/api/v1/
19、今天用Cursor修改代码时,在构建测试环节多次出现“看起来没有iPhone 15模拟器,让我使用可用的iPhone 16模拟器来构建”的提示,需要等待iPhone 15模拟器无法进行测试,并多确认一次用iPhone 16模拟器测试(甚至后来还出现了一次用iPhone 14模拟器进行测试),可能是我的Xcode里没有安装iPhone 15的模拟器,但我没有找到从哪里设置Cursor默认的模拟器,且测试过程中还出现了Cursor自动启动模拟器、安装并启动应用的情况
20、这段时间用Cursor一直用的是默认模式,没有手动切换过模型,感觉也基本够用了,可能我的应用功能比较简单吧

DevLog:2025年7月4日

1、得知在开发和测试阶段完全不需要交688
2、继续让Trae解决前一天的问题,猜测可能需求有些复杂了,于是简化需求:简化一下这个App,只允许用户添加一个大模型的API,无需添加多个模型并在不同模型间切换
3、Trae快速对前一天的代码和文件进行删减,并进行构建,提示构建成功,放到Xcode中会提示Build Failed,再次在Trae测试后仍然提示构建成功,已经解决了之前的构建错误
4、于是用Xcode打开当前项目,提示构建失败,但看了下错误提示,是缺少了两个文件夹,在项目文件夹的指定位置创建文件夹后再试,构建成功!模拟器启动,已经可以打开App、打开设置界面了,但未测试能否添加模型、能否与AI对话
5、发现这个App在模拟器上不能全屏运行,界面上面和下面都有大黑边,复制一份项目文件夹(命名test_2),让Trae尝试修正不能全屏的问题,Trae经过调整后表示已经修正,且构建成功
6、使用Xcode打开之后,提示构建成功,但还是不能全屏,继续让Trae修正,Trae修正后构建成功,再次打开Xcode打开test_2,已经可以全屏显示,并且避开了顶部的灵动岛,但输入框和发送按钮太靠近底部边缘,继续让Trae修正,添加了底部边距之后界面基本OK了,不是很理解,明明Trae在编写App时iOS系统版本是18.5以上,为什么还会有这种应用不全屏的问题
7、另外使用Xcode打开时还出现了如下错误提示:
/Users/jinlei.wu/Desktop/test/ChatApp/ChatView.swift:38:22 ‘onChange(of:perform:)’ was deprecated in iOS 17.0: Use ‘onChange’ with a two or zero parameter action closure instead.
询问豆包后得知,这是 Xcode 针对 iOS 17 及以上版本的 SwiftUI 代码给出的警告,表明Trae使用的onChange(of:perform:)方法已经被弃用,需要改用新的语法,参考豆包的答复稍作修改,错误提示消失
8、注册并下载了另一个AI编程工具Cursor,以后再试,先继续用Trae调整test_2