搜狐技术产品

在纯 Win/Linux 环境直接构建打包 iOS ,xtool 了解一下

之前聊 dart 开始支持交叉编译,可以在 win/macOS 构建 linux AOT 可执行文件时,就有人在说:「难道你还能在 win 上打包 iOS 么」,关于这个问题还真的可以,这就是今天要聊的:xtool。

image-20250510211711428
image-20250510211711428

xtool项目创建于 2024 年底,还是一个非常非常年轻的项目,起初是 2024 年作者 kabiroberai 在论坛分享了他的 Swift SDK for Darwin 项目,展示了如何在 Linux 上构建 iOS Swift 包,而这两天,它开源了成为了跨平台的 Xcode 替换实现,允许用户在 Linux、Windows、macOS 上使用 SwiftPM 构建和部署 iOS 应用。

简单来说,就是通过 xtool,你可以从 Linux 和 Windows (WSL) 构建和部署 iOS 应用:

Image

甚至,xtool还支持部署到物理设备,也就是它提供了对 iOS 应用进行代码签名的功能,那它是怎么做到这一点的?关键还是离不开 Xcode。

虽然在 Win 和 Linux 平台 Xcode 是无法安装工作的,但是 Xcode 里的 SDK 组件,包括编译器、链接器所需的头文件、库文件以及其他工具链资源等,这些其实都可以被提取出来使用。

所以,xtool实现跨平台 iOS 应用打包的核心在于其对苹果开发工具链的“重组”与“适配”,xtool会要求用户提供一个官方的 Xcode.xip文件 ,也就是苹果分发 Xcode 的压缩包,然后 xtool会解压这个文件。

❝

解压 Xcode 后,xtool会提取必要的组件,为当前非 macOS 系统生成并安装一个可用的 iOS Swift SDK ,这个本地构建的 SDK 包含了编译 iOS 应用所需的头文件、库和其他工具,通过运行 swift sdk list可以查看到新生成的 "darwin" SDK。

另外 xtool的整个构建体系围绕 SwiftPM 构建,xtool会利用 SwiftPM 来处理项目的依赖管理、编译 Swift 代码等核心构建任务 ,从而支撑构建 iOS :

  • 编译: 使用本地 Swift 工具链和生成的 iOS SDK,xtool会通过 SwiftPM 编译项目的 Swift 源代码,生成针对 iOS 平台的目标文件

  • 链接: 将编译后的目标文件和 iOS SDK 中的库进行链接,生成可执行文件

  • 资源处理: xtool支持通过 SwiftPM Resources 的方式包含图片等非代码资源文件,这些资源会特殊放置到应用包内的 .bundle目录,对于需要放置在根目录的特定文件,可以通过 xtool.yml配置文件中的 resources指定

  • Info.plist 生成与定制: xtool会自动生成一个基础的 Info.plist文件,开发者可以通过在项目中创建一个仅包含需要添加或更新的 Info.plist文件,并在 xtool.yml中通过 infoPath指定该文件路径,来实现对 Info.plist的定制

  • 应用图标: 开发者可以在 xtool.yml中通过 iconPath指定应用图标文件

  • IPA 打包: 最终,xtool会将编译好的可执行文件、处理过的资源、Info.plist以及应用图标等打包成一个 .ipa文件

之后就是签名,xtool提供了 auth命令来管理 Apple Developer Services 的认证,支持 API Key和密码两种登录模式 ,xtool通过内置的 XKit库和 Apple Developer Services 进行交互,用户需要先通过 xtool auth命令进行认证,认证成功后,xtool能够代表开发者获取必要的签名证书和描述文件,并对编译好的 .app包进行签名

❝

另外,还会使用 usbmuxd工具辅助 xtool与连接到 Linux/WSL 系统的 iOS 设备进行通信,从而完成安装操作 。

另外,针对 Bundle ID 前缀,xtool在为真实设备签名和安装应用时,会给 bundleID添加一个前缀(例如,com.example.Hello可能会变为 SC-1234.com.example.Hello),这是因为对于未注册 Apple Developer Program 的帐户,两个账户不能使用相同的 bundleID,添加前缀可以避免 bundleID冲突。

Image
❝

也就是目前短时间内只满足给未注册 Apple Developer Program 的免费账户场景。

那它是否有什么限制或者局限性?答案肯定是有的:

  • 首先不支持 Interface Builder / Storyboards,因为复制 Interface Builder 的功能被认为工作量巨大,而且由于 SwiftUI 的兴起,作者认为其优先级不高,因此目前不受支持 ,所以依赖 IB/Storyboards 的项目无法直接使用 xtool构建 UI

  • 不支持 Asset Catalogs (xcassets),因为资源目录的管理需要逆向工程来实现,目前尚未支持,但未来可能会加入 ,开发者依旧可以将图片等资源作为原始文件添加。

  • 标准的 Swift 宏(如 @Observable)可以正常工作,但苹果专有的宏,特别是像 SwiftData 中的 @Model等,目前不受支持,这些宏不仅仅是语法糖,它们涉及到复杂的编译器插件和代码生成步骤

  • 目前只能构建 “Application” 类型的目标

  • xtool内部包含支持 iOS 17 之前版本的 LLDB 调试组件,而由于苹果在 iOS 17 之后对调用 debugserver的方式进行了重大更改,所以暂时还没在内部支持,需要使用外部工具如 pymobiledevice3来进行调试。

  • 虽然目前 xtool可以构建应用并在个人设备上运行,但暂时还不支持将构建产物直接部署到 App Store Connect

xtool功能总结:

功能
xtool
支持状态
xtool
注意事项/局限性
SwiftPM 项目构建
✅ 支持
核心功能
SwiftUI 开发
✅ 支持

Interface Builder / Storyboards
❌ 不支持
被认为工作量大,优先级低
Asset Catalog 管理 (.xcassets)
❌ 不支持
需要逆向工程,可使用原始文件替代但效率较低
代码签名 (开发证书)
✅ 支持

代码签名 (分发/App Store 证书)
理论上可行 (通过 XKit),但未直接支持部署
App Store 部署功能未实现
设备安装 (开发)
✅ 支持

LLDB 调试 (iOS <17)
✅ 部分支持 (内置组件)

LLDB 调试 (iOS 17+)
⚠️ 有限支持 (需结合外部工具如 pymobiledevice3)
Apple 更改了 debugserver调用方式,集成难度大
App Store 部署
❌ 不支持
计划中,但尚未实现
标准 Swift 宏 (如 @Observable)
✅ 支持

专有 Apple 宏 (如 SwiftData @Model)
❌ 不支持
需要逆向工程或 Apple 提供宿主无关版本
App Extension 支持
❌ 不支持
仅支持 "Application" 类型 Target,计划支持
跨平台构建 (Linux/Windows)
✅ 支持
xtool
的核心目标之一

当然,最大的风险可能是苹果开发者计划许可协议 (ADPLA),关于这点我也不是很确定,因为我也不确定这是否和 ADPLA) 的条款会有冲突,例如:

Image
Image

所以从这一点看,xtool看起来处境会类似「黑苹果」一样?毕竟 xtool实现的核心能力还是离不开 Xcode 。但是,它确实给在 win/linux 上构建部署 iOS 提供了一个非常不错的思路和落地支持。

所以目前 xtool 暂时还不是一个生产力工具,而且中途夭折的可能性挺高,但是它的开源,也给大家提供了一个新的思路和基础支持,你觉得未来你可能会用上这个黑科技么?

参考链接

  • https://forums.swift.org/t/xtool-cross-platform-xcode-replacement-build-ios-apps-on-linux-and-more/79803