2019 年,苹果在 Xcode 11 的更新日志里低调扔下一行:
“New archive format: XCFramework.”
从此,iOS、macOS、tvOS、watchOS 乃至 Mac Catalyst 的各指令集切片,都能装进同一只“框架收纳盒”。
它到底解决了啥痛点
① 架构打架
以前把“真机.framework”拖进项目,再顺手把“模拟器.framework”也拖进去,Xcode 会立刻红字警告: both contain arm64, duplicate symbols.
XCFramework 出场后,Xcode 自动挑片,冲突秒消失。
② 发版“拖家带口”
旧流程: MySDK_iOS.zip MySDK_Simulator.zip MySDK_Mac.zip
README 还要写“请按需下载”。
新流程: MySDK.xcframework.zip —— 一句“全平台通用”即可。
③ 动静库混搭
同一只盒子里既能放静态 .a,也能放动态 .framework;甚至能把 libFoo.a 与 Foo.framework 并排塞入,Xcode 照样自动链接。
三步“盒”成
1. 先切好“食材”
Scheme 选 Generic iOS Device → Archive → 得到 iOS.xcarchive
Scheme 选 Any iOS Simulator → Archive → 得到 Sim.xcarchive
Scheme 选 My Mac → Archive → 得到 Mac.xcarchive
2. 一键打包
xcodebuild -create-xcframework \
-framework Archives/iOS.xcarchive/Products/Library/Frameworks/Bar.framework \
-framework Archives/Sim.xcarchive/Products/Library/Frameworks/Bar.framework \
-framework Archives/Mac.xcarchive/Products/Library/Frameworks/Bar.framework \
-output Bar.xcframework终端回显 XCFramework successfully created. 即代表盒子焊好。
3. 工程里“开箱即用”
拖 Bar.xcframework 进项目 → TARGETS → Frameworks, Libraries, and Embedded Content → 选 Embed & Sign → 编译,0 error 0 warning,收工。
给盒子加把锁
可能的坑
- 逆向:Mach-O 被 IDA 秒出伪代码;
- 调试:lldb 附加后断点随便下;
- Patch:运行时内存一改,校验逻辑直接失效;
- 符号:函数名
getLicenseKey明晃晃躺在那里。
低成本方案
Virbox Protector 目前虽不能直接对 .xcframework 整盒加壳,却支持对里面的 .framework 或可执行文件提前做:
- 指令虚拟化
- 代码加密
- 符号混淆
- 反调试
加固完再重新xcodebuild -create-xcframework打包,盒子外表依旧简洁,内部已穿盔甲。
尾声
XCFramework 就像苹果送开发者的“瑞士军刀”:一片刀片对应一个架构,合上盒子轻如鸿毛,打开后却啥平台都能削。提前给刀片镀层防锈(加壳),你的框架就能既锋利又耐腐,随取随用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。