Firebaseでプッシュ通知を行う①（Carthage編）

## はじめに

FirebaseのFirebase Cloud Messagingを使って、

プッシュ通知をするまでにいくつか躓いたため、

手順としてメモを残していきます。

今回はCarthageを使って、Firebase iOS SDKをXcodeに追加する部分を記載していきます。

## Carthageとは

- Swiftで作られたライブラリ管理ツール
- ライブラリ導入時にビルドするため、コンパイル時間がCocoaPodsより短くなる
- メジャーなSDKに対応していない場合もあるため注意（詳しくはGithub参照）

## やること

- CarthageでFirebase iOS SDKを管理
- Firebase Cloud Messagingからメッセージの作成

## 動作環境

- MacOS : Big Sur 11.5.2
- Xcode : 12.5.1
- Firebase iOS SDK : 8.7.0

## 前提条件

- brewがインストールされていること

## 事前準備

### プロジェクトのディレクトリを作成&移動

```swift
mkdir PushNotificationSampler && cd $_
```

### Carthageをインストールする

```swift
brew install carthage
```

### Cartfile作成(CocoaPods でいうPodfile)

```swift
touch Cartfile
```

### Cartfileに必要なライブラリを記述

使用したいライブラリをCartfileに記載します。

今回はFirebase Cloud Messagingのライブラリを追加します。

※FirebaseAnalyticsBinaryは必須で追加する必要

```swift
vim Cartfile
```

```swift
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseMessagingBinary.json"
```

ちなみに現時点で使用できるFirebaseのライブラリ一覧は以下のとおりです。

```swift
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseABTestingBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAdMobBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAnalyticsBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAppCheckBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAppDistributionBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseAuthBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseCrashlyticsBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseDatabaseBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseDynamicLinksBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseFirestoreBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseFunctionsBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseGoogleSignInBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseInAppMessagingBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseMLModelDownloaderBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseMessagingBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebasePerformanceBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseRemoteConfigBinary.json"
binary "https://dl.google.com/dl/firebase/ios/carthage/FirebaseStorageBinary.json"
```

### Cartfileに記載したライブラリをビルド

```swift
carthage update --platform iOS
```

iOSの分だけビルドするために、—platform iOSをつけています。

（つけない場合watchOS やOSXの分もビルドされる）

下記のディレクトリ及びファイルが作成されたことを確認する

- Carthageディレクトリ
- Cartfile.resolvedファイル

```swift
ls
Cartfile
Cartfile.resolved
Carthage
```

## Xcodeの設定

## XcodeにSDKを追加する

プロジェクトファイル > Generalタブ > Frameworks, Libraries, and Embedded Content
![qiita_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741978/86459198-b198-bfac-b627-bd079fc8ae10.png)



Add Other > Add File で以下のファイルを追加する

```swift
~/Desktop/PushNotificationSampler/Carthage/Build/FirebaseAnalytics.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/FirebaseCore.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/FirebaseAnalytics.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/FirebaseCoreDiagnostics.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/FirebaseMessaging.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/GoogleAppMeasurement.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/GoogleDataTransport.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/GoogleUtilities.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/nanopb.xcframework
~/Desktop/PushNotificationSampler/Carthage/Build/PromisesObjC.xcframework
```

追加したライブラリのEmbedをDo Not Embedに変更する
![qiita_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741978/a44a1d3a-3c60-3b86-0dff-4797545f727e.png)


Build Settingsタブ > Linker >Other Linker Flags に$(OTHER_LDFLAGS) -ObjCを追加する
![qiita_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741978/658c5e30-7b2a-49d1-e617-dee901655a5c.png)


※ -ObjCを下記のように小文字にするとエラーとなります。

✗    $(OTHER_LDFLAGS) -Objc

以上がCarthage特有の設定となります。

##参考文献

[firebase-ios-sdk/Carthage.md at master · firebase/firebase-ios-sdk](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md)

[Firebase iOS SDK（Crashlytics）をCarthageで管理する - Qiita](https://qiita.com/zizi4n5/items/5a4ecbe8bb7ab40a56d4)

[iOS初心者がCarthage導入する💪 - Qiita](https://qiita.com/tsuzuki817/items/8f6e2e0c2b3f9d197097)