分类:科技 标签:客户端开发、人工智能、跨端开发、大模型


在日常开发中,许多开发者常常好奇:如何用 Mac 顺畅地开发 Windows 软件?当下的 Windows 软件又普遍采用什么技术栈?结合近期的多端开发实践,我们可以从技术选型、AI 辅助编程以及多语言混用等维度,聊聊客户端开发在 AI 时代的全新思考。

Web、跨端还是原生:不可忽视的不可能三角

回顾客户端开发的演进,长期以来存在一条清晰的「不可能三角」:研发效率、体验与性能三者难以兼得。

  1. Web 技术栈:以早期 PhoneGap、Cordova 为代表,直接将网页塞入原生壳中。优点是研发效率极高、跨端一致性好,代价是性能与底层系统调用能力较弱。
  2. 跨端开发:包括主打移动端的 React Native、Flutter,以及桌面端大名鼎鼎的 Electron。Electron 凭借 Chromium 渲染引擎提供了极佳的多端一致性,但代价是安装包动辄上百兆、内存占用偏高。近几年虽然涌现出 Tauri、Wails 等基于系统 WebView 且体积小巧的新秀,但由于各平台系统 WebView 表现不一,多端一致性往往需要额外的兼容代码来维护。
  3. 原生开发:如苹果系的 Swift、Android 的 Kotlin,以及 Windows 的 C# + WinUI 3。原生开发前期学习曲线陡峭、投入较大,但能够深度调用系统底层能力,带来极致的性能与交互体验。

在 AI 辅助编程普及的今天,原生开发的效率短板被大幅补齐。如果是重内容的浏览型应用,Web 技术依然最省心;但对于追求深度系统集成与低内存占用的应用,原生技术依然是首选。

Windows 版原生开发:为什么选择 C# 与 WinUI 3

在打造跨平台软件的 Windows 版本时,为了不将就体验,直接选择了微软主推的原生方案:C# 结合 WinUI 3,并运行在 .NET 10 之上。

Windows 上的原生界面框架历经演进(从 Win32、WPF 到 UWP),目前微软主推的 WinUI 3 独立于系统发版,不仅能被普通 Win32 程序调用,还原生支持 Windows 11 的 Fluent 设计风格、高分屏缩放以及 ARM64 架构。通过将 .NET 运行时打包进安装包,并借助开源的 Velopack 框架实现增量更新,可以尽量让普通用户做到开箱即用、无感升级。

在多端代码同步上,虽然无法直接复用 macOS 的 Swift 代码,但可以通过制定严格的协作机制来保持两端高度一致:

  • 设计与文案同步:将 Mac 版的颜色、字号、间距等设计 Token,通过脚本自动生成为 Windows 的 XAML 资源;多语言文案也通过统一脚本转换。
  • 功能对账机制:通过一份 SYNC.md 对账表,详细记录每一个功能的实现状态、差异及原因。这种「规则抽象」在 AI 时代往往比传统的代码抽象更为重要。

Windows 开发的痛点:证书签名

相比 macOS,Windows 的分发签名繁琐不少。为了绕过 Windows SmartScreen 的安全拦截和各大安全软件的误报,正规分发必须进行代码签名。

由于微软对个人开发者的云端签名限制较多,最终选择了 Certum 的云端 OV 证书,配合 SimplySign 和手机动态码进行验证。同时,每次发版主动将安装包提交给微软的恶意软件分析门户,让软件信誉在真实使用中慢慢积累。

异构开发:如何在 Mac 上高效开发 Windows 软件

坚持「代码与 AI 上下文全留在 Mac 上」的原则,日常开发环境可以通过虚拟机与真机组合来完成:

  • 开发与编译:在 Mac (M系列芯片) 上通过 Parals 虚拟机运行 Windows 11。将仓库目录作为共享文件夹挂载,Mac 端使用 Claude Code 编写代码,通过脚本直接调用虚拟机完成编译与日志输出。
  • 真机测试验证:准备一台 ThinkPad X1 Carbon 作为真机环境,配置永不休眠,供 AI 代理 24 小时回归测试。通过远程桌面与命令行脚本结合,所有繁琐的安装、卸载与调试依然可以在 Mac 上统筹完成。

这种架构设计(如将核心逻辑与 UI 界面分层)使得绝大部分核心代码和单元测试都可以在 Mac 上验证,大幅提升了多端开发的整体效率。

客户端中的多语言混用艺术

在真正的产品研发中,不必局限于单一语言,充分利用不同语言生态的特性能够产生奇妙的化学反应:

  • 妙言 (macOS 笔记应用):纯 Swift 实现的应用中,巧妙利用 JavaScriptCore 动态执行 JS 格式化引擎,解决了复杂的 Markdown 规范化问题;底层则通过 GitHub 的 C 语言库 cmark-gfm 实现高效解析,再通过消息通道与 WebView 预览实现完美的同步滚动。
  • Pake (桌面打包工具):由 Rust 编写,但在处理下载通知等 UI 交互时,通过 Rust 与 JS 的通信机制动态渲染 Web 容器,兼顾了性能与视觉美观。
  • Kaku (终端工具):通过终端转义序列,将用户输入的自然语言交由 Lua 脚本处理,再流转至 Rust 后端请求大模型生成命令,最后回填至终端,在 zsh、Lua 与 Rust 之间无缝穿梭。

这些跨语言的混用技巧,本质上是通过中间层通信与规则对齐,将各类语言的优势发挥到极致。

总结

技术终究是为业务和用户服务的。抢不到票的客户端设计得再顺畅也毫无意义。

在 AI 时代,虽然过去需要耗费大量精力攻克的跨语言和架构难题被大模型大幅化解,但工程师的核心价值依然在于架构设计、场景洞察与严苛的测试验证。理解底层技术特性、善用 AI 辅助工具,才能在不断变化的技术浪潮中,为用户打造出真正顺手、干净的好产品。