# XCFramework 產生腳本
###### tags: `Published`
## 使用步驟
1. 把下面腳本存成 `xcframework_generate_script.sh`
2. 終端機 `cd` 到專案目錄後執行
```shell
$ sh xcframework_generate_script.sh
```
## 腳本正文
```shell=
#!/bin/bash
echo "### start execute script"
# 尋找當前目錄底下副檔名為 xcodeproj 的檔案,找不到則結束程式。
# 如果順利找到的話,應該會是像 "kkbox.xcodeproj" 這樣子的字串。
proj_name=( *.xcodeproj )
[[ -e $proj_name ]] || { echo "Not found *.xcodeproj"; exit 1; }
# 字串處理,取前段半為專案 scheme name。
# 以上面提的範例的話,會得到 "kkbox" 這樣的字串。
scheme_name="${proj_name%.*}"
echo "Successful get scheme name: $scheme_name"
# 打印出目前 xcode 使用的版本
xcodebuild -version
# archive 出實體機版本的 framework
xcodebuild clean archive \
-project $proj_name \
-scheme $scheme_name \
-destination "generic/platform=iOS" \
-archivePath "archives/iOS" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# archive 出模擬器版本的 framework
xcodebuild clean archive \
-project $proj_name \
-scheme $scheme_name \
-destination "generic/platform=iOS Simulator" \
-archivePath "archives/Simulator" \
SKIP_INSTALL=NO \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# 合併以上兩個版本成為一個 xcframework
xcodebuild -create-xcframework \
-framework ./archives/iOS.xcarchive/Products/Library/Frameworks/$scheme_name.framework \
-framework ./archives/Simulator.xcarchive/Products/Library/Frameworks/$scheme_name.framework \
-output ./archives/$scheme_name.xcframework
exit 0
```
---
### 補充資料:
- -workspace
- 指定 workspace 的名稱。如果你的專案沒有用 workspace 而是用 project 的話,就用 -project 指定 project 的名稱。
- -destination
- 指定要 archive 的平台。[這邊有所有可使用的 destination 列表](https://github.com/bielikb/xcframeworks#list-of-destinations)。
- -archivePath
- 指定產生出來 archive 的路徑。
- -SKIP_INSTALL=NO
- 告訴 xcodebuild 不要安裝產生出來的 archive。
- -BUILD_LIBRARY_FOR_DISTRIBUTION=YES
- 告訴 xcodebuild 是編譯可發佈的 library。
### 參考資料:
- https://github.com/bielikb/xcframeworks
- https://waynestalk.com/create-xcframeworks/