XCFramework 讓你可以將 iPhone、iPhone 模擬器等多的不同平台的二進位碼打包到一個可發佈的 .xcframework 檔。你只需要為你的 Framework 產生出一個 .xcframework 檔,就可以支援多個平台。而且,引用 XCFramework 的專案在編譯 iPhone 平台時,target 只會包含 iPhone 平台的二進位碼。
在之前,我們用 lipo
指令來產生一個支援多個平台的 fat framework。但是,顧名思義,fat framework 很肥大。因為引用 fat framework 的專案即使只編譯 iPhone 平台,最後 target 還是會包含 fat framework 裡所有平台的二進位碼,以至於 target 會很肥大。
Archive 想要支援的平台
你要先 archive 所有你要支援的平台。如下方的指令是 archive iOS 平台。
xcodebuild archive \ -workspace "WaynesTalk.xcworkspace" \ -scheme "WaynesTalkScheme" \ -destination "generic/platform=iOS" \ -archivePath "archives/WaynesTalkScheme-iOS" \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES
- -workspace:指定 workspace 的名稱。如果你的專案沒有用 workspace 而是用 project 的話,就用 -project 指定 project 的名稱。
- -scheme:指定 scheme 的名稱。
- -destination:指定要 archive 的平台。範例中是 iOS 模擬器。這個連結中列出了所有 destination 列表。
- -archivePath:指定產生出來 archive 的路徑。
- SKIP_INSTALL=NO:告訴 xcodebuild 不要安裝產生出來的 archive。
- BUILD_LIBRARY_FOR_DISTRIBUTION=YES:告訴 xcodebuild 是編譯可發佈的 library。
下面的指令是 archive iOS Simulator 平台。
xcodebuild archive \ -workspace "WaynesTalk.xcworkspace" \ -scheme "WaynesTalkScheme" \ -destination "generic/platform=iOS Simulator" \ -archivePath "archives/WaynesTalkScheme-iOS-Simulator" \ VALID_ARCHS="i386 x86_64" \ SKIP_INSTALL=NO \ BUILD_LIBRARY_FOR_DISTRIBUTION=YES
- VALID_ARCHS=”i386 x86_64″:如果你的 framework 有使用到如 GoogleSignIn framework,在編譯時可能會發生 xcodebuild 只找到 GoogleSignIn framework 的 arm64 但找不到 x86_64 的錯誤,這時候加上它就可以解決。
剛剛我們 archive 了 iOS 和 iOS Simulator 兩個平台。在 archives/ 資料夾下產生了兩個 .xcarchive 資料夾。這兩個資料夾下面包含了許多檔案,我們需要的 WaynesTalk.framework 可以在 .xcarchive/Products/Library/Frameworks/WaynesTalk.framework 找到,如下。
project % tree -d archives archives ├── WaynesTalkScheme-iOS.xcarchive │ ├── Products │ │ └── Library │ │ └── Frameworks │ │ └── WaynesTalk.framework └── WaynesTalkScheme-iOS-Simulator.xcarchive │ ├── Products │ │ └── Library │ │ └── Frameworks │ │ └── WaynesTalk.framework
製作 XCFramework
最後,用下面的指令產生出 .xcframework 檔。
xcodebuild -create-xcframework \ -framework "WaynesTalkScheme-iOS.xcarchive/Products/Library/Frameworks/WaynesTalk.framework" \ -framework "WaynesTalkScheme-iOS-Simulator.xcarchive/Products/Library/Frameworks/WaynesTalk.framework" \ -output "archives/WaynesTalk.xcframework"
- -framework:指定你要支援的平台的 framework 檔。
- -output:指定 .xcframework 輸出的路徑。
最後產生出來的 archives/WaynesTalk.xcframework 也是個資料夾。想要引用它的話,直接將 .xcframework 拖曳到你的專案即可,如這邊所示。
製作有 Debug Symbols 的 XCFramework
在上一小節中,我們製作的 XCFramework 沒有包含 debug symbols。如果要製作包含 debug symbols 的 XCFramework 的話,那在產生 XCFramework 時,我們還要指定 debug symbols 的路徑。
我們可以在一開始編譯好的 .xcarchive 下找到 debug symbols 檔案。
project % tree -d archives archives ├── WaynesTalkScheme-iOS.xcarchive │ ├── BCSymbolMaps │ │ └── 0324C88D-6ACC-3914-9F46-6B7D6540FA4A.bcsymbolmap │ │ └── 0A656801-098A-3169-BC81-FDB08364A694.bcsymbolmap │ │ └── 0B375D3D-C623-3E42-8F99-5D80A9F159B4.bcsymbolmap │ ├── dSYMs │ │ └── WaynesTalk.framework.dSYM ├── WaynesTalkScheme-iOS-Simulator.xcarchive │ ├── dSYMs │ │ └── WaynesTalk.framework.dSYM
然後,在產生 XCFramework 時,用 -debug-symbols 來指定 debug symbols 檔案的路徑。
xcodebuild -create-xcframework \ -framework "WaynesTalkScheme-iOS.xcarchive/Products/Library/Frameworks/WaynesTalk.framework" \ -debug-symbols "WaynesTalkScheme-iOS.xcarchive/BCSymbolMaps/0324C88D-6ACC-3914-9F46-6B7D6540FA4A.bcsymbolmap" \ -debug-symbols "WaynesTalkScheme-iOS.xcarchive/BCSymbolMaps/0A656801-098A-3169-BC81-FDB08364A694.bcsymbolmap" \ -debug-symbols "WaynesTalkScheme-iOS.xcarchive/BCSymbolMaps/0B375D3D-C623-3E42-8F99-5D80A9F159B4.bcsymbolmap" \ -debug-symbols "WaynesTalkScheme-iOS.xcarchive/dSYMs/WaynesTalk.framework.dSYM" \ -framework "WaynesTalkScheme-iOS-Simulator.xcarchive/Products/Library/Frameworks/WaynesTalk.framework" \ -debug-symbols "WaynesTalkScheme-iOS-Simulator.xcarchive/dSYMs/WaynesTalk.framework.dSYM" \ -output "archives/WaynesTalk.xcframework"