【iOS】Firebase の Notifications でプッシュ通知を送る

# これは何

[Firebase](https://firebase.google.com/) の Notifications でプッシュ通知を送った時のメモです。必要最低限のことしか書いていません。

## 実行環境

* Xcode 7.3.1
* Swift 2.2
* CocoaPods 1.0.0
* Firebase/Messaging 3.2.0

## 準備しておくもの

* Googleアカウント（アカウントがあればすぐにFirebaseを使えます）
* iOS実機（シミュレーター不可）
* APNS証明書をp12形式で書き出したファイル

証明書の作り方は下記ドキュメントを参照して下さい。
[Provisioning APNs SSL Certificates  |  Firebase](https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications)

# 新規プロジェクトの作成

※ここで言うプロジェクトとはXcodeのプロジェクトではなく、**Firebase上のプロジェクト**を指します。

Firebase のコンソールを開いて、「新規プロジェクトを作成」をクリックします。

https://console.firebase.google.com/

![スクリーンショット 2016-05-21 0.40.06.png](https://qiita-image-store.s3.amazonaws.com/0/8292/8063c55e-0bac-5539-7c8b-f05d10aa5b20.png)

プロジェクト名などを入力して「プロジェクトを作成」をクリックします。

![スクリーンショット 2016-05-21 0.43.08.png](https://qiita-image-store.s3.amazonaws.com/0/8292/ae0a15f2-8e9f-3f3f-a4b5-0fb164556801.png)


## アプリの詳細を入力

プロジェクトを作成したら、「iOSアプリにFirebaseを追加」をクリックします。

![スクリーンショット 2016-05-21 0.43.55.png](https://qiita-image-store.s3.amazonaws.com/0/8292/599c1bee-12f6-68bd-6f98-313673774466.png)

iOSアプリのバンドルID（例：com.yourapp.ios）などを入力していきます。App Store IDは任意です。ここで保存した設定ファイル（GoogleService-Info.plist）は後で使用します。

![スクリーンショット 2016-05-21 0.44.30.png](https://qiita-image-store.s3.amazonaws.com/0/8292/9939535e-777e-a8e2-1eac-26aa5fb2e981.png)




# Xcodeでプロジェクトを作成

Bundle Identifier が Firebase のコンソールで入力したバンドルIDと同じ内容になるようにします。

![スクリーンショット 2016-05-21 13.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/8292/9122b1b6-0043-dea0-bfc4-1426d83c3697.png)

プロジェクトを作成できたら、いったんXcodeは終了しておきます。

## Firebase SDKをインストール

.xcodeproj ファイルがあるディレクトリで下記コマンドを実行します。

1) pod init
2) Podfile を編集

```
pod 'Firebase/Messaging'
```

3) pod install

インストールが完了したら、 `.xcworkspace` を開きます。

## Push Notifications をオン

Capabilities の Push Notifications をオンにします。

![スクリーンショット 2016-05-21 1.30.45.png](https://qiita-image-store.s3.amazonaws.com/0/8292/628a63d6-8264-6840-a610-0a74019eaee3.png)

## 設定ファイルをコピー

先ほど作成した設定ファイル（GoogleService-Info.plist）をプロジェクトにコピーします。

![スクリーンショット 2016-05-21 0.45.50.png](https://qiita-image-store.s3.amazonaws.com/0/8292/9966cb23-bab7-b3cf-0290-e2a9d32695fa.png)

## コードを実装

Firebase を import します。

`import Firebase`

次に AppDelegate の中で `FIRApp.configure()` を呼び出します。公式ドキュメントではこれだけで実装完了と書いてありましたが、私の環境では何故かうまくいきませんでした。（デバイストークンの取得に失敗してしまう）

[ios - Cloud messaging handing terminate app - Stack Overflow](http://stackoverflow.com/questions/37333177/cloud-messaging-handing-terminate-app)

上記のQAを参考にし、最終的には以下のように実装する事でうまく動きました。Info.plist の `FirebaseAppDelegateProxyEnabled` は `NO` にしています。

```swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    let notificationSettings = UIUserNotificationSettings(
        forTypes: [.Badge, .Sound, .Alert], categories: nil)
    application.registerUserNotificationSettings(notificationSettings)
    application.registerForRemoteNotifications()
    FIRApp.configure()
    return true
}

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    if notificationSettings.types != .None {
        application.registerForRemoteNotifications()
    }
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
}
```

# プッシュ通知を送ってみる

[Firebase のコンソール](https://console.firebase.google.com/)を開き、先ほど作成したプロジェクトを選択しておきます。

## 証明書を登録

プロジェクトの設定画面を開きます。

![スクリーンショット 2016-05-21 1.10.35.png](https://qiita-image-store.s3.amazonaws.com/0/8292/61c4c14e-1cab-558b-b0cc-3bf1ec1a5704.png)


あらかじめ用意しておいた p12 ファイルとパスワードを登録します。

![スクリーンショット 2016-05-21 1.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/8292/f884fa6d-c6e9-02a5-3e41-ced088f47dc9.png)

## プッシュ送信

コンソールの左にあるメニューから「Notifications」を選び、「最初のメッセージを送信」をクリックします。

![スクリーンショット 2016-05-21 2.11.28.png](https://qiita-image-store.s3.amazonaws.com/0/8292/8e5bd4e9-4b8e-71bc-8d20-05e75ca7957d.png)

メッセージ文などを入力し、「メッセージを送信」をクリックします。

![スクリーンショット 2016-05-21 2.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/8292/7850626a-9033-05b1-551b-e20a9a5f6e6c.png)

無事、プッシュ通知がきました！

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/6c6916bd-f23a-8e1c-f67c-797c3ba57ed5.png)

# リンク

* [Firebase](https://firebase.google.com/)
* [Send a Notification to a User Segment on iOS  |  Firebase](https://firebase.google.com/docs/notifications/ios/console-audience#set_up_the_sdk)
* [Provisioning APNs SSL Certificates  |  Firebase](https://firebase.google.com/docs/cloud-messaging/ios/certs#create_the_ssl_certificate)

<iframe width="560" height="315" src="https://www.youtube.com/embed/rTB7fTqMlS0" frameborder="0" allowfullscreen></iframe>