おそらくもうご存知でしょうが
Firebase Cloud MessagingはAndroid端末に メッセージを送信するだけでなく
Appleのプッシュ通知サービス APNSを介して
iOSデバイスに送信して
通知をルーティングすることもできます
ですが その方法を説明する 価値があると思います
ちょっと面白いからですが もっと大事なことは
間違っている場合何を調べるか 分かるからです
この「Firecast」のエピソードで さらに調べてみましょう
APNSと通信するには どのサービスにも2つのものが必要です
まず 証明書が必要です
それで基本的にそもそも APNSサーバと通信できます
最近ではAPNS認証キーとして 知られているものも使えますね
これは 自分の通信コードを書いている場合 作業するのにもう少し便利です
ですが今は証明書に 焦点を当てていきます
これはFirebase Cloud Messagingが 現在使っているものだからです
次にどのデバイスに通知したいか APNSに伝える必要があります
そのためにはデバイストークンが必要です
本質的に これは あなたのアプリでのみ 動作する識別子を使って
このユーザーのデバイスを 一意に識別する方法です
このデバイストークンというのは
通常デバイスによって APNSから要求され
あなたのサーバーに送信されるものです
Firebase Cloud Messagingは
ここでサーバーの役割を 果たしているので
この2つのもの 証明書とデバイストークンが必要です
Firebase Cloud Messagingを セットアップするときに行う
最初のことの1つは APNS証明書をFirebaseコンソールに
p12ファイルの形式で アップロードすることです
これによりFCMサーバは APNSと通信できます
あなたのアプリが起動すると あなたのユーザーのデバイスは
APNSからデバイストークンを要求します
それからそのトークンを
Firebase Cloud Messagingへ 送ります
するとFirebase Cloud Messagingは
引き換えに自身のデバイストークンの コピーを作成して返送します
だからこの時点でFCMは
APNSを使用してデバイスと通信するのに 必要なすべてを持ちます
これでFirebase Cloud Messagingで リクエストを送信する準備が整いました
そこでAPNSと同様に FCM経由で通知要求を送信するには
2つのことが必要です
サービスと通信する方法
そして 対象デバイスを識別する方法です
最初に 証明書の代わりに
APIキーを使用します
それをアプリに代わって FCM サーバと通信するのに必要な
秘密のパスワードと 考えることができます
これをFirebaseコンソールから 取得できます
次に 個々のデバイスと 通信したいと仮定すると
FCMトークンも必要です
これはクライアントから 取得します
これら2つの情報は
あなたがFirebase Cloud Messagingへ 送った通知に
パッケージ化されます
これで Firebaseはエントリを調べ
FCMデバイストークンが 一致するデバイスを探して
APNSトークンに関連付けられて いることがわかります
そこで 多分このメッセージを
APNSを介してこのデバイスと 通信するのだろうなとなります
そこでFirebaseは証明書と
そちら側に格納してある トークンを使って
この通知の新しいAPNSバージョンを 作成します
この新しい通知はAPNSに送信され
そしてそれが私たちのiOSデバイスに 通知して
あなたの通知が最終的に表示されます
たくさんのプロセスですね？
ですがこの説明からとってほしい ものが２つあるとすれば
こうです
まず この作業の大部分は
舞台裏で行われていることです
大抵の場合皆さんはそのどれも 知る必要がありません
第2にここに至るまでには
これは通常の古いAPNS通知です
皆さんのアプリに関する限り この通知は
Appleから受け取った 他の通知と同じに見えます
だから 私たちのデバイスが このプロセス中に
する必要があった 作業を考えてみましょう
その一 APNSにデバイストークンを 要求すること
その二 そのAPNSトークンをFCMに送ること
その三 FCMデバイストークンを受信すること
さて APNSデバイストークンの取得は
普通のやり方では registerForRemoteNotificationsの
呼び出しでできます
これらの他のステップに関しては
皆さんは実際には何もする必要がありません
皆さんがアプリでFirebaseを 有効にしている限り
素晴らしいMethod Swizzlingのおかげで 私達がこれのほとんどを行います
Method Swizzlingの概念を よく知らない場合ですが
それは基本的に開発者が
そのメソッドのカスタムバージョンを 呼び出すことで
iOSの既存メソッドに 機能を追加できる方法です
これは通常完了したら 元のメソッドを呼び出します
今では開発者はよくこれらを使って
標準のiOSライブラリの一部である メソッドをカスタマイズしています
しかし私たちの場合
皆さんが書いたデリゲートメソッドの上に それらを使っています
そこで私達のスウィズルの didRegisterForRemoteNotificationsコールで
APNSトークンを受け取り
それをFirebase Cloud Messaging に送り
FCMデバイストークンと引き換えます
ところで実は少し嘘をついていました
このトークンは本当は InstanceIDトークンとして知られていて
理論的にはFirebase Cloud Messaging 以外のサービス用にも
デバイスを識別するため 使っていいのです
それが私達のコードのライブラリで InstanceIDによって作成されているのが見え
文書で時には皆さんの 登録トークンと呼ばれている理由です
しかしFCMを理解する目的で
これをFCMデバイストークンと 呼ぶ方が良いと思います
基本的にはそうなのですからね
また 指摘しておきますが 私たちは通知の受信にも
そのメソッドのいくつかを スウィズルします
ここで主にやっていることは
これらの通知に関する分析情報を 確実に記録することです
ここでお見せしますが
ええっ?! 「通知パネル」に 表示されるこれらの通知の30%が
開かれたレポートでした
他の誰かが自分のメソッドを スウィズルするというのが
不快な場合
これをオフにするのは大歓迎です
コードに手動で
私たちがしている仕事をすると 追加するだけです
それのための文書もあります
１つ最後の注意点ですが これらのスウィズルメソッドでは
自動的には ユーザーに可視の通知を表示するかと
尋ねるあの標準のiOSダイアログを
表示するようなことは 何も呼び出しません
これは あなたのユーザーが実際に「はい」と言うと
本当に確信するまでは
呼び出したくないものでしょうからね
だからこのメソッドはやはり
アプリに最も合った瞬間に 呼び出すあなた次第です
もっとも これはただの古い APNS通知にすぎないし
Firebase Cloud Messagingを使うのに 特に何もしなくてよいと言っても
文書中に項目があり
そこではFirebase Cloud Messagingに 明示的に接続するようにと
書いてあります
これはどういうことでしょう？
APNSを介してデバイスと 通信できるのに加え
Firebase Cloud Messagingを介して 接続し
直接そのサービスから 通知を受信することもできるわけです
しかしここにはいくつか 制限があります
まず第一にこれが機能するのは アプリがフォアグラウンドにある場合のみです
第二にこれが機能するのは データだけのメッセージのみで
警告メッセージ・マーク・ 音のようなものには機能しません
content-available メッセージでも機能しません
それらは常にAPNSを介します
実際APNSの世界では content-availableのない
サイレント通知の送信は 許可されないと思います
この種のメッセージは 私の知る限りでは
Firebase Cloud Messagingを 通じてのみ有効です
だから この種の通知を送信して
アプリがフォアグラウンドに無く
FCMに明示的に接続していない場合
再接続するまで このメッセージを受信しません
すると なぜこれをやりたいか？ですね
Firebase Cloud Messaging経由で 直接通信することには
いくつかの利点があります
1つにはFCMは傾向として これらのデータメッセージを
対象デバイスに届けることに より積極的なことです
別の場合はメッセージのホップ数が 1つ少なくなります
それはいつもいいです
また あなたのデバイスは実際には
FCM経由でアップストリームメッセージを 返信します
例えばこのメッセージが受信されたことを 知らせるために、ですね
しかしそれらはフォアグラウンドでしか 働かないので
そのユースケースは バックグラウンドで これらの通知を受信しなくてOKな
アプリに限定されています
1つの良い例はYouTubeです
彼らのiOSアプリは YouTubeライブイベントに
FCM接続を使用して ルームチャットを配信します
このアプリは実際には フォアグラウンドにいるときの
この殺到するチャットメッセージの取得しか 気にかけません
少なくともFirebase Cloud Messagingの かなり良いユースケースです
しかしあなたのアプリで
この種のメッセージが必要になれば
直接FCMサービスに接続しないことを お勧めします
少なくともFirebase Cloud Messagingの 他の作業を手に入れるまでは、ですね
それはAPNS実装の問題を 追跡しようとしているときに
対処すべき一つの余分な要素なだけです
はい これが FCMがiOS デバイスで 動作する方法の概略です
舞台裏で起こっていることが
少し良くお分かりいただけたら いいんですが
この動画が参考になったら ぜひチャンネル登録を
ではまた別の「Firecasts」で
ご視聴ありがとうございました
もっとエキサイティングな Firebaseのコンテンツをお望み？
こちらの動画をお試しください
ジャズハンド