之前聊 dart 开始支持交叉编译,可以在 win/macOS 构建 linux AOT 可执行文件时,就有人在说:「难道你还能在 win 上打包 iOS 么」,关于这个问题还真的可以,这就是今天要聊的:xtool
。
xtool
项目创建于 2024 年底,还是一个非常非常年轻的项目,起初是 2024 年作者 kabiroberai 在论坛分享了他的 Swift SDK for Darwin 项目,展示了如何在 Linux 上构建 iOS Swift 包,而这两天,它开源了成为了跨平台的 Xcode 替换实现,允许用户在 Linux、Windows、macOS 上使用 SwiftPM 构建和部署 iOS 应用。
简单来说,就是通过 xtool
,你可以从 Linux 和 Windows (WSL) 构建和部署 iOS 应用 :
甚至,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
冲突。
也就是目前短时间内只满足给未注册 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) 的条款会有冲突,例如:
所以从这一点看,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