19
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

DiverseAdvent Calendar 2020

Day 24

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

Last updated at Posted at 2020-12-23

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の設定で参考にしたもの

  2. FirebaseAnalyticsの設定で参考にしたもの

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

19
7
0

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
  3. You can use dark theme
What you can do with signing up
19
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?