Firebase Notifications からメッセージを送ってみる iOS10版

## Firebase Notifications

`Firebase Notifications`の`iOS10`での設定方法からメッセージを送る方法です。
`Firebase`と`APN`の基礎的なことははしょります。

`Podfile`に下記を追加します。

```bash
pod 'Firebase/Core'
pod 'Firebase/Messaging'
```

お約束の証明書(CSR)、秘密キー(.p12)とプロビジョニングファイルを作成します。
詳しくはこちら-> https://firebase.google.com/docs/cloud-messaging/ios/certs

### .p12の登録
Firebaseコンソールの`ギアアイコン > Project settings > CLOUD MESSAGING`を選択します。
`Development APNs certificate`から、作成した`.p12`ファイルをアップロードします。

![Firebase_Console_🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/fb301785-4fe6-3dfe-76e0-2dc1ddbc64f8.jpeg)

### Xcode Push通知を有効化
Xcodeを起動します。`Capabilities`を開き、`Push Notifications`を`YES`にします。
実機をXcodeに接続します。(シミュレータでは通知を受け取れません。)
![2MyCloudinary_xcodeproj.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/981aaef0-c915-195b-4cd6-9933c326f5e8.jpeg)

### Swift実装 (iOS10のみ対応)
リモート通知を登録し、通知を受け取るコードを`AppDelegate`に実装します。
詳しくはこちら-> https://firebase.google.com/docs/notifications/ios/console-audience

```swift:AppDelegate.swift
import UIKit
import Firebase
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        FIRApp.configure() // Firebase初期設定
        
        // リモート通知 (iOS10のみ対応)
        let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
            options: authOptions,
            completionHandler: {_, _ in })
        
        // For iOS 10 display notification (sent via APNS)
        UNUserNotificationCenter.current().delegate = self
        // For iOS 10 data message (sent via FCM)
        FIRMessaging.messaging().remoteMessageDelegate = self
        
        application.registerForRemoteNotifications()
    }

    // アプリがバックグラウンドで通知を受け、ユーザが通知をタップしてアプリをフォアグランドにした時に呼ばれる
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        
        debugPrint("You tapped the message.")

        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        print("Message ID: \(userInfo["gcm.message_id"]!)")
        // Print full message.
        print("%@", userInfo)

        completionHandler()
    }

```

フォアグランドの時に通知を受け取る場合、エクステンションでデリゲートを実装します。(iOS10)

```swift:AppDelegate+notification.swift

import Foundation
import UserNotifications
import Firebase

@available(iOS 10, *)
extension AppDelegate : UNUserNotificationCenterDelegate {
    
    // アプリがフォアグランドの時に通知を受け取ると呼ばれる
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        // Print message ID.
        print("Now Fourground. Message ID: \(userInfo["gcm.message_id"]!)")
        
        // Print full message.
        print("%@", userInfo)
    }
}

extension AppDelegate : FIRMessagingDelegate {
    // Receive data message on iOS 10 devices.
    func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) {
        print("%@", remoteMessage.appData)
    }
}
```

## Firebaseコンソールから通知を送る
Firebaseのコンソールから、Notificationsを選択し、新規メッセージを作成します。
`Advanced options`をクリックすると、`Custom data`キーバリューを設定することができます。
![8Firebase_Console_🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/afcae411-4015-7b7c-b439-0ddb22e3825c.jpeg)

![11Takashi_Futada’s_iPad.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/ed90f1d6-dbf0-0ba2-3014-80374c9a40ec.jpeg)
通知をタップすると、Xcodeのコンソールにデバッグ情報が出力されます。
![3AppDelegate_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/75231/e18cc455-ffff-9279-3549-86c00b475a94.jpeg)