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 就像蘋果送開發者的“瑞士軍刀”:一片刀片對應一個架構,合上盒子輕如鴻毛,打開後卻啥平台都能削。提前給刀片鍍層防鏽(加殼),你的框架就能既鋒利又耐腐,隨取隨用。