LoginSignup
7

More than 1 year has passed since last update.

posted at

updated at

Organization

Firebase iOS SDKをSwift Package Managerでいれてみた

Diverse Advent Calendar 2020、24日目の記事になります。

明日はいよいよクリスマスですね! :christmas_tree:

さて、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作成時に以下のエラーがでます。

ダウンロード (2).png

T/[App]_2020-12-124_00-00-00.000.xcdistributionlogs/IDEDistribution.standard
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に追加します。

93517923-f3827f80-f8e0-11ea-8789-ac721a7a307e.png

:point_down: スクリプト部を書き出したもの。

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 さんです。 メリークリスマス! :christmas_tree:


  1. FirebaseCrashlyticsの設定で参考にしたもの
    - #6864
    - Stack Overflow
    - Medium 

  2. FirebaseAnalyticsの設定で参考にしたもの
    - #6472
    - #6726 

  3. いくつか関連Issueはみつけたものの、私の環境では改善されませんでした:sob:
    - #3818
    - #3876
    - #5837
    - #6985 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
7