FirebaseのHTTP APIでiOS端末にPush通知を送る(Device Registration Token編)

FirebaseのHTTP APIでiOS端末にPush通知を送る(Device Registration Token編)

FirebaseのHTTP APIを使ってPusu通知を送るための検証をしたいと思います。
FirebaseでPush通知を送る方法は管理画面から送る方法と、HTTP APIを使う方法があります。
単発であれば管理画面でも良さそうですが、定期的に送るとなった場合はHTTP APIを使う事になると思います。

検証環境

  • XCode 7.3.1
  • iOS 8.1以上
  • Swift 2.2.1
  • Ruby 2.3.1

送信対象の選択方法

以下の3種類を送信対象にできます。
今回はDevice Registration Tokenで送信するパターンを検証します。

対象 説明
Device Registration Token アプリ側で端末ごとに取得できるレジストレーショントークンを指定して送信する
Topic Name アプリが購読しているトピックの端末全体に送信する
Device Group HTTP APIで登録できるデバイスグループ毎に送る

Device Registration Tokenを指定して送信する

端末側でDevice Registration Tokenを取得し、tokenを指定してHTTP APIでPush通知を送信します。
tokenを複数指定することで、複数の端末に送ることができます。

HTTP APIはRubyのfcmというGemを使って実行することにします。
https://github.com/spacialdb/fcm

tokenを取得する

アプリ側でtokenを取得してコンソールに出力し、送信テストのために記録しておきます。
AppDelegateに以下のように実装します。

import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        FIRApp.configure()
        
        // アプリ起動時にPush通知のパーミッションをとる+オブザーバを登録してトークンの更新を検知する
        registerForPushNotifications(application)
        return true
    }
    
    // Push Notification
    func registerForPushNotifications(application: UIApplication) {
        let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
        
        // Observerを登録し、トークン更新時に`tokenRefreshNotification`が呼ばれるようにする
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.tokenRefreshNotification(_:)), name: kFIRInstanceIDTokenRefreshNotification, object: nil)
        
        if let refreshedToken = FIRInstanceID.instanceID().token() {
            print("InstanceID token: \(refreshedToken)")
        }
    }

    func tokenRefreshNotification(notification: NSNotification) {
        let token = FIRInstanceID.instanceID().token()!
        print("InstanceID token: \(token)")
    }

    func applicationWillResignActive(application: UIApplication) {
    }

    func applicationDidEnterBackground(application: UIApplication) {
    }

    func applicationWillEnterForeground(application: UIApplication) {
    }

    func applicationDidBecomeActive(application: UIApplication) {
    }

    func applicationWillTerminate(application: UIApplication) {
    }
}

アプリ起動時に実行されるregisterForPushNotificationsn内ではオブザーバを登録し、トークンが更新された時にtokenRefreshNotificationが実行されるようにしてあります。
トークンはアプリ削除してインストールしなおした場合は確実に変わりますが、その他のタイミングでも変わります。

HTTP APIを実行するためのGemをインストール

以下のコマンドを実行してHTTP APIを実行するためのgemをインストールします。

gem install fcm

取得したDevice registration tokenに対してPush通知を送信する。

先ほど記録したDevice registration tokenを指定して端末にPush通知を送信する例です。

require 'fcm'

fcm = FCM.new("API KEYをいれます")

options = {
  priority: 'high',
  notification: { body: 'test message!' },
}

registration_ids = ['registrationi_idが入ります']
response = fcm.send(registration_ids, options)

ここで注意しないといけないのは、ペイロードに指定しているpriorityです。
highを設定しないと送信されないようです。
Firebaseのドキュメントには、normalの場合、スリープ状態だと届かないというようなことが書いてあるのでnormalでも届きそうなのですが、確実に届けたい場合はhighにしたほうがよさそうです。

Device Registration Tokenがわかれば、Firebaseの管理画面からもPush通知を送ることが出来ます。

スクリーンショット 2016-08-19 22.36.46

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
エンジニア 金子 将範 rubyist

新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。