当 AI 重塑开发体验,iOS 生态为何显得格格不入?

作者:Trevor Elkins
  • 2025-03-23
    北京
  • 本文字数:3328 字

    阅读完需:约 11 分钟

作为一名长期从事 iOS 开发的程序员,最让我感到郁闷的莫过于是看着业界发展日新月异,而我们却仿佛是在原地踏步。我试过用 lovable.dev、bolt.new,和 a0.dev 这些平台构建网站和应用,使用体验甚是神奇。反观苹果生态,我们连 Xcode 里能正常运行的 GitHub Copilot 都少有,我认识的所有开发者都把苹果的“智能功能”关闭了。

据 Expo 项目的核心开发者之一 Evan Bacon 透露的数据,目前 App Store 购物类别中排名前百的应用中,有 40 个都是采用非原生开发的。随着 AI 应用构建工具的爆发式增长,未来非原生应用的比例只会持续攀升。

iOS 开发者的“Cursor”级体验究竟在哪?

在我看来,这一切都要追溯到苹果根深蒂固的闭源传统;是一个关于企业的长期决策是如何积重难返的警示案例。那让我们深入讨论,要想在 iOS 生态中打造类似 a0.dev 的开发体验,究竟需要突破哪些技术壁垒?

代码编辑器

在用户提出修改需求时,要能对代码进行更新并验证其可编译性。听起来不难,对吗?

首先你得有一台 Mac 设备。但即便满足了这个前提条件,iOS 代码编译的复杂度依旧是臭名昭著;苹果官方从未支持过 Xcode 之外的编译环境。虽然也有xcodebuild这类的命令行工具,但其对增量编译等基础功能的支持堪称灾难。开发者还会遭遇无数琐碎且耗时的障碍:系统会反复向苹果服务器发送验证请求、检查配置文件更新状态、确认应用是否具备正确授权(使用操作系统功能的权限),以及强行增加但没人乐意用的应用锁定功能。

在我的一个本地的测试项目中,虽然我能让这条命令运行,但还是会显示下面这些编译错误:

➜  Snake git:(main) ✗ xcodebuild -scheme Snake -configuration Debug -json -destination 'platform=iOS Simulator,id=C286A4E0-BC6C-49EA-A0C7-BBAB40CB0E0B' -quiet build/Users/telkins/dev/ios/Snake/SnakeTabView.swift:8:4: error: unknown attribute 'States'  @States private var path: [Screen] = []   ^/Users/telkins/dev/ios/Snake/SnakeTabView.swift:8:4: error: unknown attribute 'States'  @States private var path: [Screen] = []   ^/Users/telkins/dev/ios/Snake/SnakeTabView.swift:15:29: error: cannot find '$path' in scope      NavigationStack(path: $path) {                            ^~~~~** BUILD FAILED **
复制代码

这种方案能行得通,大语言模型应该也能通过解析编译错误来自动修复问题,总算是有所突破了!

不过要是 AI 的解决方案需要创建新文件,这点应该难不倒 AI 吧?

现实很骨感。由于 Xcode 特有的 .xcodeproj 文件格式需要开发者手动维护文件引用关系,我们得想办法在编辑文件的同时,祈祷文件的引用不会出错。虽然开发者社区普遍使用 Ruby 工具库 xcodeproj 来操作项目文件,但苹果从未提供过官方支持工具。

到 2025 年,业内普遍推荐将代码模块化至 Swift Packages,这种方式确实有效,但每个 Package 仍需手动集成到主项目文件中。我们正处在一个尴尬的过渡期:既不能完全摆脱传统项目文件的束缚,又未能实现真正意义上的全 Swift Packages 应用构建。

幸好我们还不算彻底悲剧,目前有些值得关注的开发项目正在推进:

  • Swift Build 近期宣布开源,预计将在构建系统领域带来显著改善

  • Xcode 16 中引入的可编译文件夹功能,为非包化代码管理提供了突破性解决方案,开发者只需关联整个文件夹而非逐个文件进行关联

  • 社区开发的 Sweetpad VS Code 扩展,通过智能化工程文件管理,大幅简化了传统开发流程

然而这些补救措施终究还是在亡羊补牢。iOS 开发生态的整体闭源属性依然根深蒂固,短期内难以被撼动。

实时预览

假设我们已经通过 AI 搞定了代码修改并且能通过编译,现在就该实时预览修改的效果了。以 Lovable.dev 等平台为例,它们的实现方式是在虚拟机运行本地开发服务器,用户只需在浏览器访问特定页面即可。对于采用 React Native 的 a0.dev 来说,原理同样简单:浏览器中呈现的不过是react-native-web的运行实例,比如这样:

<foreignObject  x="21.25"  y="19.25"  width="389.5"  height="843.5"  clip-path="url(#roundedCorners)"  class="overflow-hidden">  <iframe    src="https://a0.dev/v2/52/index.html?initialUrl=exp%3A%2F%2Fu.expo.dev%2F933fd9c0-1666-11e7-afca-d980795c5824%3Fruntime-version%3Dexposdk%253A52.0.0%26channel-name%3Dproduction%26snack%3Dcc18e8a0-8c69-4bdd-8df0-7d15181cac48%26snack-channel%3D5PYBIUJa1n&amp;origin=https%3A%2F%2Fa0.dev&amp;verbose=false"    class="w-full h-full border-0"    allowfullscreen=""    allow="cross-origin-isolated; accelerometer; ambient-light-sensor; autoplay; battery; camera; fullscreen; gamepad; geolocation; gyroscope; idle-detection; magnetometer; microphone; midi; payment; picture-in-picture; screen-wake-lock; usb"  ></iframe></foreignObject>
复制代码

通过浏览器开发者工具可以看到,这个