Diverse Advent Calendar 2020、24日目の記事になります。
明日はいよいよクリスマスですね!
さて、firebase-ios-sdk は、公式ドキュメント上で CocoaPods からインストールする方法が主に記載されてますが、6.31.0から Swift Package Manager(以下、SPM)での導入もbetaでサポートされてます。
今回は、README に沿って、firebase-ios-sdk をCocoaPodsからSPMに移行する際につまづいたところを紹介しようと思います。
環境
・Xcode 12.3
・firebase-ios-sdk 7.3.1
FirebaseCrashlytics1
公式ドキュメントに記載されてるCocoaPods利用時の設定はこちら
Build Phasesに追加してたスクリプトです。
"${PODS_ROOT}/FirebaseCrashlytics/run"
SPMでは、以下の場所にライブラリのソースが配置されます。
/Users/<user>/Library/Developer/Xcode/DerivedData/<App-hash>/SourcePackages/checkouts/
/Users/<user>/Library/Developer/Xcode/DerivedData/<App-hash>/SourcePackages/
このパスはBUILD_DIR
で取得できますが、DebugビルドとReleaseビルド(Archive)でこの値が変わります。
# Debug
BUILD_DIR=/Users/<user>/Library/Developer/Xcode/DerivedData/<App-hash>
# Release
BUILD_DIR=/Users/<user>/Library/Developer/Xcode/DerivedData/<App-hash>/Build/Products
そのため、Build Phasesのスクリプトでは以下のように設定しました。
APP_BUILD_DIR=$(dirname $(dirname $BUILD_DIR))
if [ "${CONFIGURATION}" == "Debug" ]; then
SPM_PATH="."
else
SPM_PATH="../../.."
fi
"${APP_BUILD_DIR}/${SPM_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"
おまけ
CIなどで、firebase-ios-sdk に内包されている upload-symbols
を使ってarchive後のdSYMをアップロードしたい場合、
CocoaPods では、ライブラリのソースがPods配下に入るので、以下のように実行できました。
./Pods/FirebaseCrashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs
しかしSPMの場合、BUILD_DIR
のPATHを知る必要がありますが、ビルドプロセス終了後参照できなくなるため、Build Phases中にシンボリックリンクも作成して、archive後に実行できるようにしました。
# シンボリックリンク作成
ln -s "${APP_BUILD_DIR}/${SPM_PATH}" "spm"
# dSYMアップロード
./spm/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs
公式ドキュメントはこちら
FirebaseAnalytics2
FirebaseAnalyticsをいれていると、IPA作成時に以下のエラーがでます。
2020-12-24 00:00:00 +0000 Assertion failed: Expected 2 archs in otool output:
Archive : /var/folders/l9/gkg51h2n0gq224sx06z06t48d5y9wm/T/IDEDistributionOptionThinning.~~~FS4Ibi/Payload/xxx.app/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics (architecture armv7)
...
Archive : /var/folders/l9/gkg51h2n0gq224sx06z06t48d5y9wm/T/IDEDistributionOptionThinning.~~~FS4Ibi/Payload/xxx.app/Frameworks/FirebaseAnalytics.framework/FirebaseAnalytics (architecture arm64)
...
こちらのworkaroundは READMEにも記載されていて、以下の3つのFrameworkを削除するスクリプトを、Release Configuration > Build > Post-actionsに追加します。
スクリプト部を書き出したもの。
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FirebaseAnalytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/GoogleAppMeasurement.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/FIRAnalyticsConnector.framework"
おまけ
FirebaseAnalyticsをEmbedded Framework上で使ってる場合、削除対象のパスが変わるため、以下のようになります。
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/<Target>/Frameworks/FirebaseAnalytics.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/<Target>/Frameworks/GoogleAppMeasurement.framework"
rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/<Target>/Frameworks/FIRAnalyticsConnector.framework"
※Target: 利用しているEmbedded Framework名
最後に
いかがでしたでしょうか。
今回、私の携わってるプロジェクトでは、firebase-ios-sdkをCocoaPodsで使用していましたが、6系から7系に上げる際にRemote Configのfetchのコールバックが呼ばれない問題3に遭遇してしまい、SPM版に移行したところ無事改善することができました。
firebase-ios-sdkは7.3.1からCarthageのサポートが外れ、SPMとCocoaPodsの2つのサポートのみになりましたが、今後SPMサポートしたライブラリがより一層増えていきそうですね!
明日は、 @huma_shaikh さんです。 メリークリスマス!