[Swift版] 今さら聞けないFirebase⑤ Cloud Messaging (プッシュ通知）

# はじめに
今さら聞けないFirebaseシリーズ第五弾は、Cloud Messaging(プッシュ通知）の実装方法についてご紹介します。

*※ちなみに、余談ですが、プッシュ通知を許諾を拒否したことがiOS8以上でも取れるようです。*
*Firebaseと関係ありません。*

## 手順
1. Firebase上でプロジェクトを作成
2. Podfileに下記を追加する
3. APNs証明書をFirebaseにアップロードする
4. プッシュ通知を実装する
5. Firebaseからプッシュ通知を配信する

# 実践
## 1. Firebase上でプロジェクトを作成
[Firebaseの導入方法は、こちらを参照してください。](http://qiita.com/eKushida/items/54b62d3961a5c74a71af)

## 2. Podfileに下記を追加する

```:Podfile
pod 'Firebase/Core'
pod 'Firebase/Messaging'
```

## 3. APNs証明書をFirebaseにアップロードする
設定 > クラウドメッセージング > iOSアプリの設定へp12ファイルをアップロードする
（今回は、開発用のAPNs証明書を利用します）

<img width="464" alt="スクリーンショット 2016-08-13 21.14.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/ed232735-ceed-1d8d-f708-e99da42b71bb.png">

[p12ファイルの取得方法は、こちら](https://firebase.google.com/docs/cloud-messaging/ios/certs)

## 4. プッシュ通知を実装する

```:AppDelegate.swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        FIRApp.configure()
        registerUserNotificationSettings(application)
        return true
    }

    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {

        if notificationSettings.types == .None {
            //ここ注目！
            print("プッシュ通知を許可しなかったぞ！")

        } else {
            application.registerForRemoteNotifications()
        }
    }

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

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

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                     fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

        print("Message ID: \(userInfo["gcm.message_id"]!)")
        print("%@", userInfo)
    }

    func registerUserNotificationSettings(application: UIApplication) {

        let types: UIUserNotificationType = [.Badge, .Sound, .Alert]
        let settings = UIUserNotificationSettings(forTypes: types, categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    }
}
```

## 5. Firebaseからプッシュ通知を配信する
FirebaseのNotification画面の新しいメッセージをボタンを押下して、
メッセージ文や、配信日等を設定する

<img width="750" alt="スクリーンショット 2016-08-13 21.20.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/55cba9ba-4909-fbd5-9b91-c0692b62f39d.png">

## 5.1. カスタムデータを付与する
apns以外のキーは、詳細オプションから設定できます。

<img width="719" alt="スクリーンショット 2016-08-13 21.22.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/d757464f-d530-d7a9-6439-468bb6f32094.png">

カスタムデータは、Dictonary型で格納されます

```:AppDelegate.swift
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject],
                     fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

        print("%@", userInfo)
        print(userInfo["url"])
        print(userInfo["title"])
    }

```

## 動作確認
![Screen Shot 2016-08-13 at 21.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/71694/7fe4d14f-1f0c-40ab-7957-4eb1a4c58fec.png)

![Screen Shot 2016-08-13 at 21.38.13.png](https://qiita-image-store.s3.amazonaws.com/0/71694/1f1b4e1b-ade1-5509-f84e-2bfb1a68e5fe.png)

# まとめ
Cloud Messaging(プッシュ通知）の実装方法についてご紹介しました。
APNs証明書は、開発用(Development)と製品用(Distribution)がありますのでご注意を!

プッシュ通知の許諾ダイアログの表示は、
起動時ではなく、プッシュ通知が必要になるタイミングで表示したほうが良いと思います。

また、プッシュ通知の許諾を拒否した場合は、
didRegisterUserNotificationSettings(UIUserNotificationType.None)で判断できますが、
許諾を拒否したユーザ向けに再度表示することはできないようです。

## 参考
こちらを参考にさせて頂きました。
ありがとうございました。

http://qiita.com/KentaKudo/items/3bbd232d4a97aeeca3fa
http://qiita.com/tokorom/items/6c6864fa8e841e50e37b