在纯 Win/Linux 环境直接构建打包 iOS ,xtool 了解一下
之前聊 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 | |
|---|---|---|
.xcassets) | ||
XKit),但未直接支持部署 | ||
pymobiledevice3) | debugserver调用方式,集成难度大 | |
@Observable) | ||
@Model) | ||
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