XcodeGenプロジェクトのFirebaseライブラリーをSwift Package Manager経由で追加する

XcodeGenプロジェクトのFirebaseライブラリーをSwift Package Manager経由で追加する
Photo by Mark Harpur / Unsplash

実行環境

  • XcodeGen: 2.32.0
  • Xcode 13.4.1

FirebaseをSwift Package Managerで追加したい

個人アプリで、Firebaseを利用しています。
プロジェクトの構成はXcodeGenで生成しており、FirebaseはCocoaPodsで追加させていました。

しかし、Firebase 8.0.0(2021年5月11日リリース)からSwift Package Manager(以下SPMと略します)経由で追加できるようになりました。

私のプロジェクトではFirebaseのインストールがCocoaPodsの唯一の利用目的だったので、SPMに置き換えればCocoaPodsをやめれると考えました。

いろいろ調べて、XcodeGenのproject.ymlの書き方がある程度わかったのでブログに残したいと思います。

利用しているFirebaseのプロダクト

私が利用しているFirebaseのプロダクトは次の2つです。

  • FirebaseCrashlytics
  • FirebaseAnalytics

この2つをSPMで追加します。

project.yml

project.yml全体像はこちらです。
必要な項目のみを抜粋しています。

settingGroups:
  shared:
    base:
      OTHER_LDFLAGS:
        - $(inherited)
        - -ObjC
packages:
  Firebase:
    url: https://github.com/firebase/firebase-ios-sdk
    from: 8.0.0
targets: 
  YOUR_APP_NAME:
    settings:
      groups: [shared]
    dependencies:
      - package: Firebase
        product: FirebaseCrashlytics
      - package: Firebase
        product: FirebaseAnalytics
    postBuildScripts:
      - script: ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
        name: Crashlytics run
        inputFiles:
          - ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
          - $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)

各項目ごとに解説していきます。

SPMでFirebaseを組み込む

packages keyでSPMの組み込みができます。

packages:
  Firebase:
    url: https://github.com/firebase/firebase-ios-sdk
    from: 8.0.0

プロジェクトにFirebaseのプロダクトを追加する

dependencieskeyでプロジェクトにFirebaseのプロダクトを追加します。

// project.yml
    dependencies:
      - package: Firebase
        product: FirebaseCrashlytics
      - package: Firebase
        product: FirebaseAnalytics

packageに「SPMでFirebaseを組み込む」で指定した名前とproductにはFirebaseが指定している値を入力します。

https://github.com/firebase/firebase-ios-sdk/blob/master/Package.swift

上記のファイルの.libraryの名前にある文字列を指定します。

FirebaseAnalyticsならこのように指定されていました。

// Package.swift
  products: [
    .library(
      name: "FirebaseAnalytics",
      targets: ["FirebaseAnalyticsTarget"]
    ),

project.ymlに戻ります。
複数のプロダクトを指定する場合は、XcodeGenでは一つずつpackage直下にproductを指定するようです。
私は最初packageに複数のproductを紐付けて書いていて時間を1時間ほど溶かしたので、みなさんもぜひ気をつけてください。

// ○
- package: Firebase
  product: FirebaseCrashlytics
- package: Firebase
  product: FirebaseAnalytics
  
// ☓
- package: Firebase
  product: FirebaseCrashlytics
  product: FirebaseAnalytics

FirebaseAnalytics特有の指定

FirebaseAnalyticsには-ObjCのリンカーオプションが必要です。

XcodeGenで指定するには以下をymlに記述します。

OTHER_LDFLAGS:
    - $(inherited)
    - -ObjC

FirebaseCrashlytics特有の指定

FirebaseCrashlyticsを利用するにはdSYMファイルをアップロードする設定が必要です。

XcodeGenではpostBuildScriptskeyで以下を指定するとアップロードされるようになります。

postBuildScripts:
    - script: ${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
    name: Crashlytics run
    inputFiles:
        - ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
        - $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)

おわりに

XcodeGenでFirebaseをSPM経由で追加する方法を解説しました。
これでCocoaPodsをやめることができてプロジェクト構成をXcodeGen一本に絞れました。
嬉しい。

参考

宣伝

AmazonとBOOTHにて「Swift Concurrency入門」発売中です。
AmazonはインプレスR&D社より発売しました商業誌版で、BOOTHは同人誌版です。
組版は異なりますが、内容は変わりません。

Swift Concurrencyを網羅的に学べ、さらに既存アプリへの適応方法も解説しています。
日本語で体系的に学べる解説本は他になかなかありません。
ぜひチェックしてください!

商業誌版

一冊でマスター!Swift Concurrency入門

一冊でマスター!Swift Concurrency入門

同人誌版



Swift Concurrency入門


https://personal-factory.booth.pm/items/3888109