DevLog:2025年12月1日

1、目前ChatWith for Mac的主要问题在于偶发应用卡死问题,之前已经多次修复但一直未能解决,先暂停

2、先把手机端的NoteWith搞一个版本到手机上进行实测,目前的NoteWith还有很多地方需要完善下才能通过TestFlight发布测试版,比如还没有应用图标(需要让ChatGPT给做一套),上次将对话和备忘录改用Core Data存储之后未做实际测试,且还需要引入三方库MarkdownUI和RichTextKit,完善AI问答和备忘录的渲染效果和编辑体验

3、先让ChatGPT给设计图标,这次以蓝色为底色,并且“也需要一些设计感,像上面那套图标那样简洁就可以”,但这次ChatGPT也把“NoteWith”给套到了对话消息的图标里,要求“不要把NoteWith放在对话消息图标里,没有体现出Note的含义”,然后要求ChatGPT基于这张图生成一套用于iOS App的图标文件,可以直接放到项目文件里使用,很快就生成了,图标搞定

3、时隔半个月再打开Cursor,发现它推出了自己的模型Composer 1,据称生成速度相比同类模型快四倍,且目前可以免费使用,决定使用它来为应用引入三方库MarkdownUI和RichTextKit

4、先引入MarkdownUI,指令“我需要为当前的应用引入三方库MarkdownUI,用于AI问答内容的显示效果渲染”,Cursor指出需要先添加Swift Package Manager依赖,再更新代码以使用MarkdownUI渲染AI回答内容,在引入MarkdownUI之后更新了AIChatView,以使用MarkdownUI来渲染AI回答内容,并且相比之前自定义的MarkdownRenderer增加了代码块、行内代码等样式,接下来需要在Xcode中打开项目,MarkdownUI会自动下载并集成,AI问答内容将使用MarkdownUI进行渲染

5、Composer在执行这次修改时速度的确很快,但在修改结束后未能进行构建测试,要求构建之后仍然不行,说是“命令行构建因模拟器配置问题无法完成,但依赖已成功解析,代码语法检查通过,项目配置正确,建议在Xcode中直接构建和运行,Xcode会自动处理模拟器配置”

6、然后打开Xcode,发现模拟器又要更新版本至iOS 26.1,需要下载8.32GB,看来我的确是有阵子没有用Xcode运行iOS应用了,而且貌似在新的系统版本下载完之前无法进行构建测试,只能等了,看今晚能不能把模拟器下载完,明天再构建测试

7、想尝试添加一个自定义的模型,在Cursor的设置中,目前预置的模型包括Composer 1、Grok Code、Kimi K2,并且可以通过填写API Key等信息快速添加OpenAI、Anthropic、Google、Azure、AWS Bedrock的模型,有一点之前没有注意,就是如果要使用其他兼容OpenAI的模型的话,可以开启“OpenAI API Key”,填写Key,并打开Override OpenAI  Base URL修改API地址,然后在上方找到Add Custom Model填写模型名称,我试一下OpenRouter的Claude Sonnet 4,不知道为啥加不上,感觉添加模型不是很方便

8、上周看Trae.ai官方公众号推送了文章说TRAE SOLO已经登陆中国版,并且可以免费使用,今天更新了下Trae,据介绍,SOLO 模式集成包括 IDE 在内的多种工具。你只需表达需求,它就会基于目标主动推进完整开发流程。

-SOLO=The Responsive Coding Agent,可以让你直观了解智能体正在处理的内容——从文件、工具到完整的工作上下文,它会随你的操作和变化即时响应,始终与你的工作流保持同步。

-从清晰的规划开始,与子智能体协作,将复杂问题拆解为更为聚焦的任务。借助完整代码上下文进行迭代、重构与优化,实现高精度的工程化执行。

-自动将长对话整理为结构化的任务流,清晰呈现执行路径。所有改动统一汇总在代码变更视图,配合上下文状态统一展示,方便回溯与协作。

介绍了这么多,也没有看出来它到底和之前、和Cursor有什么不同,后面再实际测试看看吧

DevLog:2025年11月17日

1、继续修正之前的问题,并且增加一些细节,首先是数据统计功能,对Cursor说:我需要在设置中增加针对每个模型的数据统计功能,显示自从该模型被添加以来的对话数据量,包含输出Tokens和输入Tokens,这一修改涉及Core Data模型、AIService、DataManager和AIModelManagementView

2、修改后测试发现AIModelManagementView里显示的内容有些多,比如Base URL这一行其实没有必要在这里显示,数据统计功能现在像是一个表格,改成单行就可以了,继续让Cursor修改

3、测试过程中发现对话时偶尔会遇到点击发送按钮后应用卡死的情况,继续让Cursor排查问题,Cursor进行了添加防止重复发送机制、优化Core Data操作、改进错误处理、减少不必要的操作等改进,但仍然没有解决问题,我在打开应用后,打开一个有历史对话记录的对话,输入问题并提交后应用就会卡死,可能是加载历史对话记录导致的卡顿?Cursor优化了处理大量历史消息时的性能问题,并且优化消息的payload构建,包括预取数据、减少faulting、优化排序等等操作

4、再次测试,首次打开一个有对话记录的对话并且提交问题后不会卡死了,但切换到另一个对话并且提交问题时又卡死了,Cursor继续优化流式响应处理,但依然存在应用卡死的问题,甚至打开应用后,打开一个已有历史消息的对话,应用就会被卡死

5、再次修改时,Cursor采用了分批处理消息(每批处理50条消息,避免一次性处理过多)、异步执行、预取优化等操作,并指出卡死时因为打开有大量历史消息的对话时,应用会一次性处理所有消息,长时间占用主线程,Core Data faulting导致同步IO操作,且排序操作在处理大量数据时耗时,现在我看见Cursor这种煞有介事的解读都已经麻木了,AI对自己的思考和操作都非常自信,但实际结果可能并没有多么好,实测果然还是会卡死

6、决定先绕开这个问题,将应用的对话界面修改成每次打开应用时,默认用模型列表里的第一个模型开启新对话,这样应该能避免一打开应用就加载历史对话导致的卡死问题,修改后的工作流程变成了:应用启动时,AIChatSessionListView出现——检查是否有模型配置——如果有模型,使用第一个模型创建新对话——自动选中新对话,用户可以直接开始聊天

7、修改之后实现了我的需求,但我发现目前应用的流式输出好像又出现了问题,像是每次跳出来一两句甚至一两段,Cursor分析后表示这是因为之前使用定时器延迟更新(0.12秒),导致内容在buffer中累积,每0.12秒才更新一次UI,于是将content和thinking内容改成了立即更新,不再使用定时器延迟,tavilyResults也改成了立即更新,这样可以实现接近逐字显示的平滑输出效果,明天再测试下看看

DevLog:2025年11月7日

1、今天再次遇到了用ChatWith for Mac对话时应用卡住的问题,但强制退出、重新对话时又能正常对话了,猜测可能是因为单个对话中内容比较多时,应用还未加载完成就提问,就会导致应用卡死?而且我还发现在不同对话间切换时,有时不会直接跳到最新的对话底部,有时还需要滚动一下才能看到对话内容,体验上也不够统一,继续优化,并且需要把停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计这些功能加进来,测试基本完善后,更新版本号为v0.3,移动端NoteWith的开发暂停

2、向Cursor反馈了这些问题,询问是否是因为内容加载机制导致的,Cursor分析后表示的确和对话内容加载机制有关,主要包括“流式更新时频繁遍历Core Data关系”和“每次保存都整表刷新会话列表”,建议拆分保存和刷新逻辑,减少loadAISessions()调用频率,或换成增量更新,同时在切换会话和流式结束后再合适地触发滚动,避免“滚动到底部”信号在数据还没稳定时被打断

3、具体操作上,需要先重构流式消息的更新方式,再优化Core Data刷新的节奏,修改一次之后依然存在打开对话窗口时不自动滚动到最新对话底部的情况,再次让Cursor修改之后可以自动滚到到最新对话底部了

4、接下来开始增加一些小功能,包括停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计,先增加停止生成按钮(发送消息后、正在回答时发送按钮变成停止生成按钮,点击可以停止生成)、消息时间显示(显示绝对时间),这两个功能都在AI对话界面里,其他功能稍等

5、修改过程中发现,今天Cursor的对话的语言风格突然变了,可能是Auto模式换成了另一个模型?而且也不会根据我之前的要求自动进行构建测试了,甚至在我要求进行构建测试时,也会出现因为权限问题导致的构建失败,挺奇怪的

6、修改之后测试发现已经有了停止生成按钮(但未测试)和消息时间显示功能,连续询问了三个问题,前两个问题都可以正常回答,但第三个问题在点击发送后应用就卡死了,我提交了调试信息,Cursor再次进行了节流流式更新、结束时一次性收尾、降低Core Data压力等优化,这次依然没有自动进行构建测试,那我只有自己继续测试了,连续多轮对话看是不是还会被卡死

7、连续问到第三个问题时应用依然会卡死,再次让Cursor修改,流式输出过程中只往缓冲区追加字符串,不直接操作Core Data,用定时器把写库和UI刷新节流到120ms等操作,这样每条回复只会做少量大块复制,避免了第三次对话时的主线程卡顿(当然这都是Cursor说的,具体体验如何还得看测试结果),再次测试,打开上次因卡死未收到回复的对话时也被卡死了,这次Cursor进行了清理空白AI消息、修改滚动逻辑、思考内容默认折叠(我还是更希望默认展开)等操作,再次测试,切换对话、切换模型后提问时依然有问题

8、这两天对ChatWith应用卡死问题的修改不是很顺畅,开始反思到底有没有必要在同一个对话里切换模型,对这种操作的支持,可能增加了应用的复杂性,如果增加一个默认模型机制(其实一开始是有的,但我给去掉了),每次创建新对话时就直接用默认模型,或者在新建对话时即要求用户选择模型,在一个对话中只允许使用一个模型,可能会更简单一些,但我最初借鉴的Chatbox和Cherry Studio,的确都支持在对话过程中切换模型

DevLog:2025年11月6日

1、让Cursor将当前版本(v0.2)打包,Cursor这次还同步创建了发布说明文档,其中包括版本信息、安装说明、更新内容、系统要求、支持的AI平台、反馈与支持、注意事项等内容,看起来还是挺规范的

2、已经用上了v0.2版本,以后对话时多多使用,修正问题并进一步优化,同时我还询问了Cursor下一个版本的建议,以细节补充和优化为主,Cursor给出了高、中、低三个不同优先级的建议,但我个人还是觉得有些并不着急

3、高优先级建议包括停止生成按钮(发送消息后按钮变成停止生成按钮,可以随时点击停止)、会话重命名/自动命名(其实现在可以重命名,也会自动获取用户的最后一个问题作为会话的名字)、消息复制按钮(已有)、快捷键支持(比如给创建新对话、切换模型、搜索等功能指定快捷键,这个可以有)、错误处理优化(更友好的错误提示、API限流处理、离线模式、崩溃日志等,我暂时不需要)

4、中优先级建议包括重新生成功能、代码块复制(这个可以有)、消息时间显示(我忽略了这一点,现在还真没有)、空状态设计(无对话、无收藏时的引导界面,这个好像也已经有了)、数据导出功能(收藏内容导出成.md还是比较实用的)

5、低优先级建议包括主题色自定义(花里胡哨,不需要)、使用统计(显示使用次数、Token消耗等,后面可以加上)、标签分类(暂不需要)、字体调节(暂不需要)、帮助文档(暂不需要)

6、总结一下,v0.3要增加的功能包括:停止生成按钮、快捷键支持、代码块复制、消息时间显示、数据导出功能、使用统计,也都是一些细节上的补全

7、目前在进行中的开发项目,移动端有ChatWith、NoteWith和DoitWith,Mac端有ChatWith for Mac和NoteWith for Mac,NoteWith for Mac是由移动端NoteWith修改而来,功能上相当于在ChatWith基础上增加了备忘录和待办事项功能,整合的功能比较多,后续可能会考虑删掉待办事项功能,留给DoitWith,且AI对话功能需要重复开发,暂时先搁置,接下来继续开发移动端NoteWith

8、将近三个月没有修改过NoteWith了,甚至都忘了它的功能都有啥,先让Cursor梳理一下目前的项目,都有哪些功能,有哪些优化建议,在梳理过程中,先整理了应用功能与优化建议文档,然后检查发现了重复文件,Cursor建议先清理重复文件(我还发现目前应用文件夹里有多个Trae创建的项目文件备份和.sh文件,也都不需要了,一并清理掉)、清理调试打印和未使用的代码,后面可以考虑更换数据持久化方案为Core Data,然后优化性能、扩展功能等等

9、Cursor直接删掉了15个无用文件(应用能否正常运行还有待验证),然后我删掉了多余的空文件夹,和之前不知道啥时候、由哪个AI工具编写的重构指南文件,以及一个项目初始化脚本setup.sh

10、时隔三个月再次启动了iOS模拟器,iOS 26已经发布,模拟器也换成了iPhone 17 Pro、iOS 26.0,并且部分界面也自动变成了iOS 26的效果,比如底部的AI对话、备忘录、我的三个按钮及其切换效果,决定趁现在应用功能还很简单,结合近期修改ChatWith for Mac的经历,先开启一个新对话,把NoteWith的AI对话和备忘录的数据永久化方式改为Core Data,AI模型、设置等仍然采用UserDefaults

11、Cursor的建议是使用Core Data存储Note、AIChatSession、AIMessage、SearchLink、deletedNotes,仍然使用UserDefaults来保存AIConfig和应用设置,因为Core Data适合结构化数据,支持关系、查询和迁移,UserDefaults适合小量配置,访问频繁但更新不频繁

12、接下来创建Core Data模型文件和相关组件,创建了备忘录、AI对话、AI消息、搜索链接四个实体及对应的扩展类,重构了DataManager,并更新了项目文件,和以往修改数据永久化方式一样,这次Cursor也增加了迁移机制,首次运行时会自动将现有的UserDefaults数据迁移到Core Data,但因为当前应用还没有发布,不需要迁移机制,让Cursor去掉了迁移机制,并且修复了构建错误,具体使用体验怎么样,哪些功能受到了影响,明天再测试,然后引入三方库MarkdownUI和RichTextKit,完善AI问答和备忘录的渲染效果和编辑体验

DevLog:2025年11月5日

1、今天先来修复在对话过程中切换模型会导致应用卡死的问题,以及思考内容高度超出400点后无法自动滚动到最新内容的问题

2、昨天Cursor分析了切换模型可能导致应用卡死的问题,认为首要问题在于Core Data并发冲突,主要修复策略是1.将通知监听器从sheet移到主视图 2.使用安全的方式更新Core Data 3.添加状态管理避免并发冲突,测试发现仍然会卡死,于是要求Cursor添加调试信息来定位问题,在排查过程中还出现了在不同对话间切换会卡死的问题,甚至只是打开一个对话就会导致应用卡死

3、Cursor在对话流程涉及的多个文件中都添加了大量调试信息,在可以正常切换对话、可以看到对话内容后,又出现了与支持深度思考的模型对话时看不到流式输出,但调试信息里可以看到正在输出的问题,原因在于负责思考内容的ThinkingProcessView的ScrollView频繁重建导致卡死(思考内容每秒更新10-20次——每次更新都重建ScrollView——ScrollView重建会触发布局计算——主线程被大量布局计算阻塞,导致卡死),修改过程中Cursor移除了ScrollView,改用简单Text,并且移除了展开/折叠动画,但我觉得展开/折叠动画还是可以保留的,又让Cursor加了回来

4、在修改过程中顺便给浅色模式下的AI对话增加了不同的底色,在最近更新系统到macOS 26之后,浅色模式下对话内容底色太浅,几乎是透明的,深色模式还是正常的,切换深色和浅色外观有时不会立即生效,也一并修改了

5、还是感觉AI回答内容的输出有些慢,怀疑可能是先接收到所有回答内容后再批量输出,Cursor认为当前“应该是”实时流式输出,但也添加了调试信息来帮我确认,如果是实时流式输出,就会在每次收到新内容后,MessageView立刻重新渲染,如果是批量延迟输出,就会在内容累积完成后再渲染,结合调试信息,的确是实时流式输出,在回应Cursor之后,Cursor便自动开始清理所有调试日志,让代码更简洁,涉及文件包括AIChatView、AIViewModel、AIService、MessageView、DataManager、CoreDataManager、TavilySearchService、AIChatSessionListView,二百来行调试信息

6、再次测试,发现现在又出现了在对话中切换模型、发送问题后应用会卡死的问题,打开一个新对话并且使用新模型就不会卡死,要求Cursor把跟这个过程相关的调试信息加回来,好定位一下问题出现在哪里,但添加调试信息后重新测试,发现无论是在新创建的对话里切换模型,还是在已有的对话里切换模型并对话,应用都不会再卡死,难道还是概率性出现?先留着调试信息,后面如果再出现就直接提交给Cursor

7、我需要在设置-关于页面下面增加一个文本区域,显示近期更新内容,并且让Cursor先拟一下近期更新点,微调内容和顺序之后,把版本号也改成了v0.2,以后每个版本都在这个位置显示一下更新日志,目前的更新日志包括:

“🎯 新增OpenAI、DeepSeek、Anthropic Claude及硅基流动、火山方舟等14个平台预设”,

“✨ 优化 AI 模型配置流程,自动填充常用平台的完整 API 地址”,

“🚀 大幅优化流式输出性能,AI 回答更加流畅”,

“🎨 改进消息气泡样式,浅色模式下有明显的背景色区分”,

“🎨 优化思考过程显示,支持完整内容展示”,

“⚡ 优化 Core Data 保存策略,减少数据库操作频率”,

“🔧 修复应用在切换对话时卡死的问题”,

“🔧 修复应用在切换模型后发送消息时卡死的问题”,

“🔧 修复深度思考模型卡死的问题”,

“🔧 修复外观模式切换无法生效的问题”,

“🐛 修复空消息导致的渲染循环问题”,

“🐛 修复死锁问题,提升应用稳定性”

8、然后优化收藏界面,发现在点击右上角的复制按钮时虽然的确可以复制整条收藏内容,但没有任何提示,于是让Cursor增加了Toast提示,并且在2秒后自动隐藏

9、收藏界面最右侧详情栏会显示两行一模一样的标题,Cursor检查后在收藏列表(NoteListView)和收藏内容(NoteEditView)中各有一个标题,只保留了后者,正好和复制收藏的按钮位于同一行,但复制按钮的高度好像有点高,导致收藏列表顶部的分割线和收藏内容顶部的分割线不对齐,可能是plus和doc.on.doc两个图标本身高度就不一样,于是让Cursor改成了文字按钮“创建新对话”和“复制收藏内容”,这下高度都一致了

10、再在更新日志中增加一条“🎨 优化创建新对话、复制收藏内容按钮的样式,删除重复的收藏标题”,明天继续测试、优化应用

DevLog:2025年11月4日

1、继续试用ChatWith,发现目前的应用在使用支持深度思考的模型时,思考内容好像限制了显示高度,一旦达到高度限制,就不会随着思考的内容继续自动滚动,Cursor表示思考内容的显示高度的确固定在了400点,且超出之后会出现滚动条,但超过400点后就不会再自动滚动,在修改过程中发现了另一个问题,好像在对话中切换了另一个模型,再提出新问题时应用就会卡死

2、Cursor分析了可能导致应用卡死的几个问题:Core Data并发冲突、通知监听器生命周期、状态读取时序、缺少状态同步,特别是Core Data并发冲突,由于直接在主线程修改Core Data managedobject,如果此时用户立即发送消息,可能造成并发访问冲突,updateAISession可能触发Core Data save操作,与其他操作冲突,明天继续修改这个问题

3、添加其他模型来测试Base URL的填写方法,之前已经要求Cursor将其改为用户手动填写AI服务的跟地址,应用会自动补全路径,比如api.openai.com、openrouter.ai/api,然后针对火山引擎的“应用”(bots)做了特别优化,需要填写完整地址https://ark.cn-beijing.volces.com/api/v3/bots/,测试发现百度云千帆的Base URL填写仍然有问题,比如我填写官网提供的https://qianfan.baidubce.com/v2/chat/completions就会连接失败,删掉v2往后的内容也不行,只填写https://qianfan.baidubce.com也不行,与其设定各种复杂的自动补全规则,倒不如直接要求用户填写完整的Base URL,或者应用内置一些常用的Base URL来的简单

附上常用的几个AI的Base URL:

OpenAI

https://api.openai.com/v1/chat/completions

DeepSeek

https://api.deepseek.com/v1/chat/completions

OpenRouter

https://openrouter.ai/api/v1/chat/completions

硅基流动

https://api.siliconflow.cn/v1/chat/completions

火山方舟

https://ark.cn-beijing.volces.com/api/v3/chat/completions

或

https://ark.cn-beijing.volces.com/api/v3/bots/chat/completions

百度云千帆

https://qianfan.baidubce.com/v2/chat/completions

阿里云百炼

https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

4、询问Cursor目前应用在Base URL补全方面的规则是怎样的,根据回答内容,规则包括:

1.如果没有http://或https://,就自动添加https://

2.如果URL末尾有斜杠,就自动移除

3.如果已经包含完整路径,就不做任何修改

4.如果包含部分路径,就自动补全,比如补全v1,补全/chat/completions

5.如果只有基础URL,就自动补全/v1/chat/completions

按照这套规则,我填写了完整的百度云千帆的Base URL,应该能正常使用才对,但填写完整地址之后测试仍然提示404

5、问题可能出现在自动补全v1上,也就是在“包含/chat/completions但不包含v1时,会自动添加v1前缀,包含/api/、/bots/、/v3/、/v2/,且不含/chat/时,则添加chat/completions”这里,根据Cursor给出的示例,可能会出现/v1出现在/chat/completions之后的情况

6、目前的规则的确有些复杂,可能用户在填写过程中也会不知道该填写完整的地址还是部分地址,倒不如直接在应用里内置几个常用的、完整的Base URL,由用户自行选择,要求:目前的规则有些复杂,我希望能在添加和编辑AI模型界面,预置几个常用的API平台的完整Base URL,用户只需要填写备注、模型名称、选择模型提供商、填写API Key、填写Tavily API Key即可使用模型

7、Cursor在修改过程中创建了APIProvider枚举,包含10个常用平台(OpenAI、DeepSeek、Anthropic Claude、OpenRouter、Google Gemini、智谱GLM、月之暗面Kimi、百度文心一言、阿里通义千问、腾讯混元、自定义),这样就不再需要配置路径补全规则,用起来也更方便了,先添加几个模型试试,再决定要不要增加或删减APIProvider

8、在修正因为使用中文引号导致构建失败的错误之后,百度云千帆和火山方舟的API都可成功连接,当API提供商选择自定义时,需在“高级设置”的Base URL中填写完整地址,即带有/chat/completions的地址

9、APIProvider需要增加硅基流动、火山方舟、百度云千帆、阿里云百炼,这四个都放在“自定义”前面,另外我发现在选择某个APIProvider之后,模型名称部分也会出现预置的模型名称,但我不需要,改成由用户手动填写模型名称,修改之后测试了几个不同的模型,都可以成功连接了

DevLog:2025年10月31日

1、今天开始继续完善NoteWith for Mac,并且持续试用ChatWith for Mac,积累下一个版本的优化点

2、参考之前ChatWith for Mac的经验,先让Cursor按照目前的功能模块梳理一下文件结构,另外笔记功能也看下有没有合适的三方库可以较好地支持富文本编辑,就像渲染AI回答内容的markdown-ui一样

3、目前应用包含的功能模块有AI对话、备忘录、待办事项、设置、搜索以及通用组件,架构上分成了Models数据模型、Services服务层、ViewModels视图模型、Views视图层,数据存储方式上,备忘录、AI对话都采用了Core Data,但TodoItems和TodoGroups以及AIConfigs仍然是用的UserDefaults

4、然后让Cursor根据目前的架构整理了一下文件夹,代码组织清晰了一些,接下来运行一下试试,看看都哪些功能需要调整

5、首先,目前的备忘录在打开时默认是预览模式,需要在详情里点一下然后切换到编辑模式,询问Cursor有没有比较好用的三方库,能让目前的备忘录模块实现类似苹果备忘录的富文本编辑功能,且不需要在预览和编辑模式间切换,Cursor给出了三个方案,方案一是RichTextKit,专为SwiftUI设计,支持实时富文本编辑(所见即所得),无需在编辑/预览模式间切换,且API简洁,易于集成,可以实现类似苹果备忘录的编辑体验;方案二是AttributedString+NSTextView,即对当前的方案进行优化,这个方案我是肯定不会用的,相当于又倒退了;方案三是ProseMirror via WKWebView,可以实现功能完整的富文本编辑器,支持表格、列表、链接等,但因为需要通过WebView嵌入,导致性能开销较大,且与SwiftUI的集成略复杂,体积也较大

6、综合看下来只有方案一最符合我的需求,下周再让Cursor集成RichTextKit,试试效果

DevLog:2025年10月30日

1、有半个月没有打开Cursor了,这段时间Cursor已经更新到了2.0,界面上的最大变化就是在原本的Editor模式之外增加了一个Agents模式,暂时还没有发现具体的区别是啥

2、带我入门的Cherry Studio近期也在频繁更新,但感觉越来越臃肿了,目前已经有助手、智能体、小程序、知识库、文件、代码工具、笔记等功能模块,但我常用的也就第一个,也就是目前ChatWith for Mac的核心功能,后续可能会将收藏功能改成知识库,其它的暂时都用不到,而且目前Cherry Studio的响应速度也越来越慢,尤其在开启联网搜索后,先要深度思考一段时间,再调用联网搜索的结果,再从联网搜索结果中总结整理,整个过程比豆包的深度思考模式(边搜边思考)还慢,甚至让我又打开了界面丑陋但功能简洁的Chatbox

3、在前段时间修改搜索页、联网搜索逻辑,并调整部分界面显示效果后,今天打包一个当前版本,继续使用并在使用中发现问题、看是否要增加新功能

4、询问Cursor当前应用都在哪些地方限定了版本号?根据Cursor的回答,在Xcode项目配置文件ChatWith.xcodeproj/project.pbxproj中有MARKETING_VERSION(市场版本号)和CURRENT_PROJECT_VERSION(构建版本号),在设置详情SettingsDetailView中有硬编码的版本号,Cursor建议改为动态获取,已修改

5、然后让不同的AI来设计应用图标,用同样的指令试了豆包、ima、ChatGPT,还是ChatGPT的效果更好,豆包生成的图标混杂了一些奇怪的字符,ima生成的图标审美有些差,有些“复古”,ChatGPT生成的图标很简洁耐看,然后让ChatGPT先不做圆角效果,可以平铺整个画面,我再用Xcode中的AppIcon来生成图标,也能很好地理解我的需求并提供了图片

6、在添加图标前,发现目前的Assets文件中的AppIcon.appiconset/Contents.json配置仍是为移动设备设计的,当然还是因为这个应用是从iOS应用修改而来的,于是让Cursor修改了Contents.json为macOS配置

7、在翻看ChatGPT提供的图标设置方法时,发现它可以帮我生成可以直接拖入Xcode的AppIcon.iconset文件夹,其中包含所有尺寸的图标,我把ChatGPT提供的压缩包中的文件放到对应的路径之后再打包应用,果然已经有图标了,ChatGPT还是厉害

Mac常用App推荐:Obsidian及实用插件

换用vivo X100 Ultra之后,因为不能使用苹果的备忘录,我用了Obsidian大概一年时间。这次结合个人的使用情况分享一下Obsidian的主要功能,一些比较实用的Obsidian第三方插件,以及对我而言它的优势和不足,仅供参考。

一、笔记基础功能

使用Obsidian记笔记更像是在管理文件,很多地方都与管理文件的思路类似。比如可以打开文件所在路径,直接添在访达中添加或修改文件夹,在不同的文件夹之间移动笔记等等。

单篇笔记可以左右分屏、上下分屏,方便对比笔记中的不同内容,可以同时打开多篇笔记,也可以把某篇笔记以单独的窗口打开,自由度很高。

笔记内容的编辑功能很完善,需要注意的是,Obsidian是一款典型的Markdown笔记工具,如果要设置样式,需要添加特定的符号标记,虽然也可以用Editing Toolbar插件实现一些具备富文本效果的编辑操作,便于调整版式,但它本身仍然是一款Markdown工具,点击带有格式的文字位置,仍然会看到符号标记。

除了基本的笔记功能之外,还支持关系图谱功能,可以用“双链”构建知识网络,也可以用“白板”梳理素材和思路,下文详细说。

在多端同步方面,Obsidian官方提供了包含多端同步在内的服务,按月付款每月5美元,能获得跨设备同步、端到端加密、版本历史、通过共享仓库协作等服务。当然也可以通过个人OneDrive账号或iCloud来实现免费的多端同步,实测同步效果还可以,下文详细说。

如果需要复杂排版,或者个人比较偏好可视化操作,喜欢所见即所得,推荐用富文本工具,比如苹果设备自带的备忘录就是典型的富文本笔记工具。如果追求写作效率、喜欢简洁的界面、需要进行长期的知识管理,推荐用Obsidian这种Markdown工具。

二、关系图谱管理

Obsidian和其它笔记工具的主要差异,在于它的重点是构建个人知识网络,而非传统的收集信息。从一条条孤立的笔记到用关系图谱管理知识网络,虽然可能需要一些时间的积累,但长期用起来就会发现这个功能有多方便。

通过Obsidian的关系图谱功能,可以建立笔记间的关联,还能用双向链接关联到某条笔记中的某个段落。比如可以将关于同一个主题的多条笔记进行关联,方便后续查看和管理。设置关联后,在关系图谱中会在多条笔记之间画线表示存在关联。有两种方法可以建立关联:双向链接、标签。

双向链接:在笔记内容里添加双方括号,就能添加双向链接,点击链接可以直接跳转到对应笔记,在设置关联时也会根据输入的内容自动匹配可能要关联的笔记。默认会显示被关联笔记的完整标题,也可以在完整标题后面加一条竖线再自己随便编个别名,这样就会只显示笔记的别名,看起来更顺眼一些,点击同样也能跳转。

通过双向链接建立关联后,可以在笔记界面右下角查看反向链接,即有哪些笔记链接到了当前这条笔记,或者在设置-反向链接中开启“在标签页中显示反向链接”,就可以在笔记底部更方便地管理关联笔记。如果被关联的笔记有更新,Obsidian会提示是否更新。

或者,也可以用标签来标记笔记,在笔记中任意位置输入井号和文字就能添加标签,点击某个笔记中的标签,就能快速查看使用同一标签的所有笔记。

在关系图谱中的设置中,可以给不同的标签、文件路径、文件名等设置不同的颜色组,让关系图谱更符合自己的使用习惯,也更容易找到一些重要的内容,还可以设置是否显示孤立文件,大家可以多试试。

个人认为没有必要建立过多链接,可能会让关系图谱变得杂乱,而且就我个人的工作需求来看,也不需要建立太多关联,因为很多笔记之间根本没有什么关系。

三、白板

Obsidian的白板功能提供了无限大的画布,可以在这里自由组织和连接笔记、图片、文字、网页等等。我觉得这三个场景比较适合使用白板:需要一些视觉化的手段来管理多篇笔记;需要写作,但素材分散在好几篇笔记中;需要记录一些脑暴想法,方便后续整理。

在白板里,不仅可以根据需要添加纯文本的卡片,并且随时将其转换为笔记文件,也可以粘贴一些截图到白板中。并且白板中的这些元素之间可以添加连线,也可以自由调整卡片大小,或者选中后创建分组,自由度相当高,推荐大家体验下。

四、网页浏览器

Obsidian内嵌了web viewer(需要先在设置-核心插件里启用网页浏览器),既能从笔记里点击链接打开浏览器,也可以在新标签页中直接打开浏览器。

有了这个功能,一些比较简单的资料搜索需求可以直接在Obsidian内搞定,可以直接将网页保存到内容库(Save to vault),也可以选中文字并右键保存到笔记中,简化了资料收集操作。这个内嵌的浏览器同样可以设置默认首页、搜索引擎、保存网页的文件夹、广告屏蔽规则,界面非常简洁,但整合的功能都相当实用。

五、实用插件推荐

接下来结合网上看到的推荐文章和我的实际体验,给大家推荐几个实用的插件。

1、Editing Toolbar

正如名字一样,编辑工具栏,调整格式非常方便,尤其对于不是很习惯Markdown语法的朋友们来说更是必备插件,选中文字再点击格式按钮就能设置格式了。

2、Importer

可以将其它笔记工具的内容导入到Obsidian,支持导入Notion、Evernote、Apple Notes(苹果的备忘录)、Microsoft OneNote、Google Keep、Bear、Roam以及HTML文件,是从其它笔记工具搬迁到Obsidian的必备插件。安装之后点击主界面左侧的Importer图标就能快速导入。

3、Remotely Save

不想订阅Obsidian官方的同步功能,并且没有使用苹果设备的话,可以用它给Obsidian增加跨端同步功能,需配合OneDrive个人版使用,同步速度也还可以,如果出现同步失败的情况,可以在Remotely Save插件的设置中对OneDrive进行鉴权,可恢复正常。

但是,偶尔会需要重新鉴权,大概一周左右会需要重新鉴权一次?而且还存在同步不及时的情况,比如我在电脑上使用时,如果中途打开了一次手机端Obsidian,再切到电脑端,进度可能会回退,新创建的文件可能会消失,比较影响使用。

说到这里,顺便说一下在苹果设备间通过iCloud同步的方法:

首先在iOS设备上创建iCloud仓库,打开Obsidian,点击 “新建仓库”,在仓库名称中输入相应名称,启用 “存储在iCloud中” 选项,然后点击 “创建”。

然后在Mac上打开Obsidian,在 “打开本地仓库” 右侧选择 “打开”,导航到 “iCloud→Obsidian”,选择在iOS设备上创建的仓库文件夹即可。这种同步方式明显比通过OneDrive要简单且稳定的多。

4、Copilot

可以为Obsidian增加AI对话能力,或者基于个人的笔记进行问答等等,下文详细说。

需要注意的是,安装插件前需要先在设置-第三方插件中关闭安全模式并且架梯子,才能访问社区插件市场。

六、Copilot插件使用方法

在Obsidian中使用Copilot插件接入AI,可以实现Chat、Vault QA、右键菜单修改内容三种功能,Chat可以询问AI任何问题,Vault QA可以询问有关现有笔记的问题。这样让自己的笔记真正成为一个知识库,也可以更方便地用AI辅助创作。

先说怎样添加模型(Chat Model和Embedding Model,前者负责对话,后者负责建立所有笔记的索引)。

关于Chat Model,可以直接在Copilot插件的设置界面中填写几家大模型的API Key,并选择、使用模型,支持OpenRouter、Gemini、OpenAI、Anthropic、Cohere、XAI、Groq、Mistral和DeepSeek。

或者添加自定义的模型,点Model标签页的Add Model——填写Model Name——选择Provider(OpenAI Format,或者选择Ollama来调用本地模型)——填写Base URL和API Key——Verify一下,提示成功就可以Add Model。添加Embedding Model的方法类似,然后将Default Chat Model和Embedding Model切换成刚刚添加的模型。

在添加自定义模型时,有一个“Enable CORS”的选项,一直没弄明白到底要不要开,询问ChatGPT,它说Enable CORS用于允许Copilot向非同源的大模型API发起请求,主要解决本地、自建或内网模型接口被浏览器跨域机制拦截的问题,勾选Enable CORS之后,会放宽网络访问限制,Copilot也提示“Only check this option when prompted that CORS is needed”,也就是只有在系统提示需要CORS时才开启,大家可以在使用过程中试一试。

添加Embedding Model之后,会快速对所有笔记内容进行索引,并且打开任何一篇笔记都会在右侧边栏推荐相关笔记,点击就能直接查看相关笔记,推荐的还是比较准确的。如果变更Embedding Model,需要重建整个库的索引,但也很快,我这有1000+条笔记大概半分钟索引完毕。

奇怪的是,在添加自定义的Embedding Model时,即使是用的同一个嵌入式模型(比如BAAI/bge-m3),如果选择Provider为SiliconFlow,再填写API Key,就会提示Key错误,如果选择Provider为OpenAI Format,并填写硅基流动的Base URL和API Key,就能正常添加并且开始indexing。

另外,值得一提的是,在Copilot中使用DeepSeek-R1或者其它支持深度思考的模型时,也可以看到思考过程。

然后说说用法。

在Obsidian主界面点击左侧工具栏的“对话窗口”标志即可在右侧窗口启动Copliot插件,之后可以使用Chat或Vault QA两种模式。

Chat模式可以进行三种问答:直接问AI任何问题;输入“双方括号”(表示引用某条笔记)再输入命令,可针对引用的笔记进行回答;输入大括号{activeNote}并提出问题,可针对当前活跃的笔记进行问答。

vault QA模式可以结合你选中的笔记或者某个文件夹中所有笔记的内容进行问答,比如结合这些笔记做一些总结等等,这两种模式下AI回答的内容都可以复制、插入到笔记中,或者重新生成回答。并且在这两种模式下与AI对话的内容都会默认保存到copilot>copilot-conversations文件夹下,便于回顾。

在使用Obsidian的过程中,也可以在笔记里选中一段内容,点击右键菜单Copilot,进行语法修正、翻译、总结、简化、扩写等等操作,输出结果可以直接插入到笔记中。

七、优势和不足

优势:

1、界面超级简洁,没有任何的装饰,使用过程中响应速度很快。

2、如果不设置同步机制,所有的笔记都是纯本地存储,更加安全。

3、有大量的插件可以自行安装,扩展应用的功能,可以在社区插件市场里下载安装。

4、支持macOS、Windows、Linux、Android、iOS这些主流平台,并且在不同平台上的功能、文件结构、使用方法都基本一致。

不足:

1、Obsidian是原生Markdown笔记,不知道大家是不是都习惯用Markdown语法,就我个人而言,日常笔记内容以文字为主,但Obsidian不方便保存一些带有符号的文字,比如想用井号体现微博话题,想用星号备注一些内容,就会被识别成Markdown语法,变成tag和斜体字,再比如把加粗的文字粘贴到word文档或者其它地方,就会出现一组双星号(MarkDown语法标记),还需要手动删除。

2、安装的插件如果比较多,或者保存的笔记比较多的话,冷启动会比较慢。

3、如果使用的是多台苹果设备,在多设备间通过iCloud同步会很方便,而且速度很快,但如果是其它设备,比如安卓手机和苹果电脑、Windows电脑,要么订阅Obsidian的同步服务,要么依赖Remotely Save插件和OneDrive,略显繁琐,且有时会同步失败。

不定期更新App推荐及使用心得,欢迎关注。

最初发布于2025年12月26日

用了一年vivo X100 Ultra,相比iPhone它有哪些优势和不足?

这是vivo X100 Ultra体验报告系列的最后一篇了。

在前两篇文章里,我重点说了一下vivo X100 Ultra的影像体验和应用生态问题(这个其实算是安卓系统的通病),在这篇里,我把其它使用感受都汇总到一起。说明一下,从入手这台vivo X100 Ultra到现在差不多一年时间了,vivo X300和X300 Pro也已经发布,相信vivo X300 Ultra还会有更多亮点,这篇仅供大家了解vivo X100 Ultra相比iPhone 15 Pro Max的优势和不足,并不能代表两个品牌的最新机型。

先说vivo X100 Ultra这台手机对比iPhone 15 Pro Max的优势吧,或者也可以说这些是国产安卓旗舰的普遍优势。

优势1:信号比iPhone好太多

尤其在地铁里这种人多且信号差的地方,vivo X100 Ultra比iPhone 15 Pro Max的信号明显要好很多,比如早高峰期间,在信号特别差的几站,看漫画时不会再出现加载失败的情况,只是会加载地稍微慢一点,用爱奇艺看视频时中断和缓冲次数也比用iPhone 15 Pro Max时少了很多。即使是之前一直会断连的某地铁站的地下通道,现在也有微弱的信号了,可以正常听歌不中断了,出站时也会非常快地重新连接网络。

优势2:电话拦截功能很好用

iPhone需要依赖腾讯手机管家才能开启电话拦截功能,但好像只会标注,不会拦截,而且在将系统更新到iOS 26之后,电话拦截功能暂时失效了,腾讯手机管家给出的口径是“官方修复中,请耐心等待”,可能还要等下一个版本更新了。

vivo X100 Ultra可以根据设置自动拦截骚扰电话、疑似诈骗、广告推销、房产中介、保险理财等类型的电话,以及未知号码、空号码来电、海外来电等等,同一张卡装在vivo X100 Ultra上明显安静了很多。但也存在一些误判情况,比如前段时间我约了一个上门维修,对方给我打了好几个电话都被手机给拦截下来了,很尴尬,这可能是根据大家的标记数据来判断的吧。

优势3:游戏体验良好

我玩的游戏不多,常玩的仅有原神和绝区零两款,以原神为例,在iPhone 15 Pro Max上,绝大多数设置均为默认,仅调整帧率至60,玩十来分钟后手机温度上升明显,且会出现肉眼可见的掉帧。

而在vivo X100 Ultra上同样仅调整帧率至60,其它均为默认设置,手机温度明显低于iPhone 15 Pro Max,且温度分布均匀,持续玩一段时间后帧率无肉眼可见的明显波动,我没有用什么专业的帧率测试工具,只看主观感受,vivo X100 Ultra的表现还是很不错的。

唯一的不足,可能就是大型游戏在首次安装以及大版本更新之后,需要很长时间来“编译着色器”,这应该也是安卓手机的惯例了,iPhone在游戏更新后无需进行这一步,载入速度会快一些。

优势4:NFC功能很好用

iPhone的NFC功能比较单一,基本上除了Apple Pay刷公交卡、支付宝碰一碰付款和一些汽车的解锁之外,很少有其它的应用场景。vivo X100 Ultra(或者说支持NFC功能的安卓手机)的NFC功能就不一样了,支持读取和模拟多种类型的卡。我先录上了小区门禁卡,进小区时终于不用再掏钥匙了,充ETC也比之前方便太多。同样的ETC服务App,在iPhone 15 Pro Max上只能连蓝牙充值,速度非常慢,容易失败,也无法使用NFC功能充值,这个问题在vivo X100 Ultra上完全不存在。

接下来说几类感受比较明显的问题,先声明一下,以下内容中有些不是vivo X100 Ultra独有的问题,可能是国内安卓手机普遍存在的问题。而且有些问题可能会随着OriginOS的更新被修复。

问题1:一些系统本身和自带应用的问题

屏幕分辨率调至3200*1440以后,一些照片会看到比较明显的色彩断层,即使是iPhone拍摄的照片使用vivo官方的互传App导入到相册之后,也会有一些色彩断层现象存在,但显示效果明显要好一些。并且这一问题不只存在于vivo X100 Ultra的相册,比如朋友圈背景之类的地方也能看到色彩断层,用默认的2400*1080分辨率时该问题不明显。

vivo X100 Ultra上大部分自带App都可以删除,但自带的百度输入法定制版无法删除,只能再安装其它输入法并切换。

OriginOS的小组件分成了原子组件和应用挂件两类,原子组件支持零层级交互,可以直接在桌面上点击操作,应用挂件则只能展示应用的信息,个人觉得同时保留两种小组件,会让体验有割裂感。

自带App在默认情况下广告较多,当然基本都可以自行关闭,稍微有点动手能力的都可以搞定。

云端照片和手机端照片的同步存在问题,比如我相册中的照片显示有9300多张,但云端照片显示只有8100多张,中间差的1000多张也不知道是哪些(已经打开了自动同步照片)。

相册的智能分类不是很准确,有一些非常明显的错误,比如室内的演唱会照片被分类到“天空”,古城墙的照片被分类到“小汽车”、地铁站站台的照片被分类到“文档”,等等。另外,智能分类的文件夹,如果封面图对应的照片被删除了,封面图还会保持原样,也很奇怪。

相册的清理建议不是很准确,一些有明显差异的照片也会被判定为重复照片,导致我相册里9000+照片有5000+被建议清理,其实绝大部分都是主体高度接近但区别很明显的照片(比如在演唱会拍的歌手照片),建议根据需要仔细对比后再删。在iOS上只有真正重复的照片才会被判定为重复照片。

在使用一些全屏应用时,其它应用消息弹窗的样式不统一,比如在用微信读书、哔哩哔哩漫画时,微信如果收到消息,有时会只在右上角显示一个小图标(这也是我设置的形式),但有时也会是一个长条的消息弹窗,连这都统一不了吗?

问题2:一些手机硬件相关的问题

和很多同年发布的旗舰手机一样,vivo X100 Ultra也使用了曲面屏,会出现误触问题,比如单手拿手机看优酷爱奇艺,很容易碰到App里推荐的其它视频,这个问题我已经遇到很多次了,系统设置中的防误触也仅有“口袋防误触”。

而说到口袋防误触,这个功能好像效果也不是很好。默认打开的情况下,有次我骑自行车,手机没有锁屏,竟然连我的微信头像都给换了,甚至换了不止一次,头像用的图片是我刚刚和朋友聊天的部分截图,也不知道这口袋防误触防了个啥?

曲面屏手机带来的另一个问题,就是任何一个手机壳都无法完全包覆手机正面的边缘,总感觉不能保护好手机。以后可能我都不会买曲面屏手机了好消息是,最近两年的新旗舰都开始回归直屏了。

按键质感比较差,不知道是安装公差还是什么原因,vivo X100 Ultra的按键总是晃晃悠悠的,甚至还能上下滑动,而且因为采用了曲面屏,按键设计的非常细,按下去时也比较硌手。

vivo X100 Ultra前置单摄像头支持面部解锁手机,但解锁的成功率有点太高了,高到让我觉得不安全,甚至只是瞥一眼放在桌面上的手机,它就会自动解锁,我只用了一天就关闭了面部解锁。

问题3:一些iPhone有但难以迁移/替代的功能

首先是iPhone的CarPlay,vivo X100 Ultra支持“智能车载”,但好像是基于百度CarLife套了个壳?使用起来问题还是挺多的。比如一旦拔掉数据线,导航和音乐都要重新开启;比如分辨率适配有问题导致车机屏幕画面模糊,且手动调节到正确的分辨率之后会导致车机黑屏;比如未完成行程时,在手机上退出导航之后车机端还在会自动按之前的目的地开启导航,只有拔掉手机才能解决;比如判断车辆方向存在问题,有时会往前开一段才提示需要掉头;比如切歌时会有三四秒的延迟,按键之后需要等一等才会切到下一曲;比如导航和音乐的音量无法单独调节,等等,真的很难用。

其次,vivo X100 Ultra的交通卡只有国内各省市的,如果想要开通香港的八达通,就需要再安装八达通和Google Wallet两个App,使用起来体验也比较差,不像iPhone可以直接在钱包里开通八达通,且过闸机和支付都非常快。去日本要用的西瓜卡,iPhone的钱包里也能直接开通,拿着vivo手机则只能去办Welcome Suica实体卡。

暂时先想到了这些,以上内容只是我在使用vivo X100 Ultra一年后的一些粗浅的感受,如果有错误欢迎大家指正。

最初发布于2025年10月21日