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


在 AI 辅助编程普及的今天,客户端开发的技术边界正在被重新定义。如何打破“研发效率、体验与性能”的不可能三角?如何在一台 Mac 上丝滑搞定 Windows 原生软件开发?本文将结合实际项目经验,聊聊多端技术选择的思考、AI 时代的架构设计,以及多语言混血调用的奇妙解法。

一、 Web、跨端还是原生:技术选型的不可能三角

做客户端开发多年,面对的无非是三条技术路径:

  1. Web 技术栈:如早期 PhoneGap、Cordova,以及现代的 Electron。其优势是开发极快、多端一致性好(统御于 Chromium 引擎),但代价是体积庞大、内存占用高。
  2. 跨端开发:包括早期的 React Native、Weex,到后来的 Flutter(自研渲染引擎),再到如今用 Rust 写的 Tauri 或 Go 写的 Wails(借助系统 WebView)。跨端在研发效率和性能之间取了一个平衡,但往往需要处理不同平台的兼容细节。
  3. 原生开发:如 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 辅助开发的浪潮下,虽然编写代码的门槛在不断降低,但架构思维、测试验证以及对业务场景的深刻理解,依然是工程师无可替代的核心价值。代码编写或许会变得不再有趣,但未知的新探索永远值得期待。