分类:科技 标签:客户端开发、人工智能、大模型、跨端技术
在 AI 辅助编程普及的今天,客户端开发的技术边界正在被重新定义。如何打破“研发效率、体验与性能”的不可能三角?如何在一台 Mac 上丝滑搞定 Windows 原生软件开发?本文将结合实际项目经验,聊聊多端技术选择的思考、AI 时代的架构设计,以及多语言混血调用的奇妙解法。
一、 Web、跨端还是原生:技术选型的不可能三角
做客户端开发多年,面对的无非是三条技术路径:
- Web 技术栈:如早期 PhoneGap、Cordova,以及现代的 Electron。其优势是开发极快、多端一致性好(统御于 Chromium 引擎),但代价是体积庞大、内存占用高。
- 跨端开发:包括早期的 React Native、Weex,到后来的 Flutter(自研渲染引擎),再到如今用 Rust 写的 Tauri 或 Go 写的 Wails(借助系统 WebView)。跨端在研发效率和性能之间取了一个平衡,但往往需要处理不同平台的兼容细节。
- 原生开发:如 Swift + SwiftUI、Kotlin + Jetpack Compose、C# + WinUI 3。前期投入大、学习成本高,但能深度调用系统底层,带来极致的性能与流畅体验。
在 AI 时代,一个人编写多套原生代码的成本大幅下降,效率瓶颈被显著补齐。如果是重度依赖系统底层能力的工具类应用,原生依然是首选;而如果追求极致的发布速度,跨端技术依然能发挥奇效。
二、 Windows 原生开发实战:C# 与 WinUI 3 的抉择
在开发 Mac 软件(如 Mole)时坚持使用了原生的 Swift + SwiftUI。因此,在推出 Windows 版本时,同样倾向于选择最贴合 Windows 平台的原生方案:C# 结合 WinUI 3,运行在 .NET 10 之上。
- 框架优势:相较于老旧的 WinForms 或 WPF,微软主推的 WinUI 3 将界面框架独立发版,完美支持 Windows 11 的 Fluent 设计风格,且对高分屏缩放与 ARM64 提供了原生支持。
- 打包与更新:通过 .NET 10 的长期支持版本,将运行时直接打包,避免用户额外折腾;同时利用开源的 Velopack 框架实现增量更新,推出 x64 与 ARM64 各自的原生安装包。
1. 规则抽象大于代码复用
虽然两端视觉和交互需要保持高度一致,但底层的逻辑代码由于系统差异(如 macOS 的 ~/Library 路径规则),很难直接复用 Swift 代码。因此,Windows 版几乎是从零开始。
为了保持功能同步,核心策略是:视觉 Token 与文案由脚本统一生成,功能对齐则通过 SYNC.md 对账表进行约束。这表明在 AI 时代,底层的代码复用已经退居其次,规则抽象反而成为了最核心的能力。
2. 复杂的证书签名生态
Windows 开发相比 macOS 繁琐的一点在于证书签名。没有签名的程序极易触发 SmartScreen 拦截或被安全软件误报。经过调研,最终选择了 Certum 的云端 OV 证书,配合 SimplySign 动态码进行验证。每次发版主动将安装包提交至微软恶意软件分析门户,慢慢积累信誉,从而完成正规分发。
三、 异构工作流:如何在 Mac 上高效开发 Windows 软件
坚持代码与 AI 上下文必须留在 Mac 上,具体架构和工作流如下:
- 开发环境:Mac 主机配合 Paralslls Desktop 运行 Windows 11 虚拟机,仓库作为共享文件夹挂载。通过
prlctl exec脚本在虚拟机中直接编译、看日志。 - 四层架构解耦:
- Core 层:只依赖 .NET,不碰 Windows 接口,核心清理规则可在 Mac 的内存文件系统中运行。
- Platform 层:处理注册表、文件系统等系统调用(启用
EnableWindowsTargeting以便在 Mac 上编译)。 - ViewModel 层:处理界面状态,与 Mac 版本一一对应。
- WinUI 层:最上层的界面,在 Windows 中编译。
- 真机测试兜底:使用一台 ThinkPad X1 Carbon 作为真机环境,结合远程终端和脚本 24 小时跑自动化测试,处理虚拟机无法准确覆盖的高分屏、电池及 SmartScreen 验证。
四、 跨语言混血:让不同语言生态优势互补
在客户端开发中,不应受限于某一种语言,而应根据具体场景进行多语言混血。
- Mac 笔记应用(妙言):纯 Swift 实现,但为了解决复杂的 Markdown 格式化难题,巧妙调用了
JavaScriptCore执行 JS 脚本;分栏编辑中,利用底层的 C 语言库cmark-gfm标记行号,再通过消息通道与 WebView 实时同步滚动。 - 桌面打包工具(Pake):以 Rust 为主,但在需要展示 Toast 弹窗时,通过 Rust 调用 JS 在 Web 容器中动态渲染,实现性能与美观的兼顾。
- 终端 AI 工具(Kaku):结合 zsh、Lua 与 Rust,通过终端转义序列将自然语言发给后台生成命令并安全回填,完成了一次巧妙的跨语言“偷梁换柱”。
总结:技术服务于业务
技术选型与架构设计再完美,归根结底还是要解决用户的真实痛点。正如抢演唱会门票一样,用户不在乎底层用了什么框架,只在乎产品是否好用。
在 AI 辅助开发的浪潮下,虽然编写代码的门槛在不断降低,但架构思维、测试验证以及对业务场景的深刻理解,依然是工程师无可替代的核心价值。代码编写或许会变得不再有趣,但未知的新探索永远值得期待。