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

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

image-20250510211711428

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值