如何製作一個 XCFramework

Photo by Florinel Gorgan on Unsplash
Photo by Florinel Gorgan on Unsplash
XCFramework 讓你可以將 iPhone、iPhone 模擬器等多的不同平台的二進位碼打包到一個可發佈的 .xcframework 檔。你只需要為你的 Framework 產生出一個 .xcframework 檔,就可以支援多種平台。

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"
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Alex Alvarez on Unsplash
Read More

Dispatch Queue 教學

GCD 提供有效率的並行處理,讓我們不需要直接管理多執行緒。它的 Dispatch Queues 可以循序地(serially)或是並行地(concurrently)執行任務。我們只需要將要並行的程式當作任務提交到 dispatch queues 就可以了。
Read More
Photo by Fabian Gieske on Unsplash
Read More

SwiftUI @State & @Binding 教學

SwiftUI 推出了兩個 Property Wrapper – @State and @Binding。利用它們可以達到變數的 Two-way Binding 功能。也就是當變數的值改變時,它會重新被顯示。本章藉由製作一個 Custom View 來展示如何使用 @State 和 @Binding。
Read More
Photo by Svitlana on Unsplash
Read More

iOS:禁止螢幕截圖

基於一些理由,我們可能會想要禁止使用者對我們的 app 做螢幕截圖。然而,iOS 並沒有提供這樣的功能。所幸,我們可以利用 UITextField 來達到此效果。
Read More