Vue + Cordova + Firebase でプッシュ通知
はじめに
Vue + Cordova + Firebase でプッシュ通知を利用する方法を整理した。
※Firebase やプッシュ通知の細かい仕様については詳しくないため、最新/最適 でない方法の可能性があることに注意。
※試行錯誤を経て成功した後に情報を整理しているので、手順漏れや実施タイミングが異なるものなどがあるかもしれないことに注意。
関連: Node.js で firebase-admin を使ってサーバからプッシュ通知
TL;DR
- プラグインは dpa99c/cordova-plugin-firebasex を利用
- arnesson/cordova-plugin-firebase ではないので注意
- iOS の証明書周りでハマるポイントがあるので注意
目次
環境・条件
1 | $ sw_vers |
Xcode Version 11.3.1 (11C504)
詳細
リポジトリ: 17number/vue-cordova-firebase-push-example
事前準備
iOS: Identifier/Profile 作成
Certificates, Identifiers & Profiles で必要なリソースを追加しておく。
Identifier 作成
App IDs
→ Continue- 以下を 選択/入力 して Register
Platform
:iOS, tvOS, watchOS
Description
: 適宜Bundle ID
:Explicit
, 適宜Capabilities
:Push Notifications
にチェック
プッシュ通知用 証明書の登録
Identifiers で先ほど作成した ID を選択
Certificates(0)
となっているはずなので Configure
Create Certificate
→ Choose File
で以前作成した CertificateSigningRequest.certSigningRequest
を選択。
プッシュ通知用の証明書ファイル(aps.cer
, aps_development.cer
)をダウンロードし、ダブルクリックでキーチェーンに登録
Profile 作成
iOS App Development
Select an App ID
- 対象 App ID(
vueCordovaFirebasePushExample
)
- 対象 App ID(
Select Certificates
- 自分の Certificate
Select Devices
- 自分のデバイス
Provisioning Profile Name
vueCordovaFirebasePushDevelopmentExample
- Generate → Download → 実行してプロファイルを追加
プロジェクト作成
vue create
vue-cli
でプロジェクト作成。各種設定はお好みで。
※vue-cli
のバージョンがちょっと古いが、ひとまず無視した
1 | $ vue create cordova-push-example |
vue add cordova
cordova 環境の構築。ここも各種設定はお好みで。
1 | $ vue add cordova |
いくつかのファイルを修正、317ebe5 を参照。
ビルド確認
プッシュ通知の話に入る前に、一度ビルドできるか確認しておく。
iOS
Xcode を開いて Signing & Capabilities
を変更。
1 | $ open src-cordova/platforms/ios/VueCordovaPushExample.xcworkspace/ |
Mac と iOS デバイスを接続し、ビルド/デプロイ できるかを確認
1 | $ npm run build-deploy-ios |
Android
Mac と Android デバイスを接続し、ビルド/デプロイ できるかを確認
1 | $ npm run cordova-serve-android |
Firebase の設定
Firebase を設定。
プロジェクト作成
Firebase console にアクセス
プロジェクトを作成 → cordova-push-example
→ アナリティクス無効 → 作成
アプリの追加
プロジェクトページに移動 → 左上 Project Overview ⚙
→ プロジェクトの設定
マイアプリで追加
iOS
Firebase で iOS
のボタンをクリックして追加
アプリ情報 入力
GoogleService-Info.plist
をダウンロード
GoogleService-Info.plist
を src-cordova
直下に配置。
※GoogleService-Info.plist を Xcode プロジェクトのルートに移動
とあるが、後でインストールする dpa99c/cordova-plugin-firebasex プラグインがファイルコピーしてくれる。
1 | $ mv ~/Downloads/GoogleService-Info.plist src-cordova/ |
Firebase SDK の追加
CocoaPods で色々とするように書かれているが、dpa99c/cordova-plugin-firebasex が自動で実施してくれるので、ここではインストールだけ行っておけば良い。
CocoaPods未インストールの場合はインストール。pod
コマンドでエラーが出る場合は再インストールする。
参考: Cocoapods doesn’t work on Catalina · Issue #42906 · Homebrew/homebrew-core
1 | $ which pod |
iOS build notes に従い pod repo update
, sudo gem install cocoapods
も実行しておく。
1 | $ pod repo update |
初期化コードの追加
この手順も dpa99c/cordova-plugin-firebasex が自動で実施するので、ここでは行わなくてよい
Android
アプリ情報 入力
google-services.json
をダウンロード
google-services.json
を src-cordova
直下に配置。
※Android アプリ モジュールのルートディレクトリに移動
とあるが、後でインストールする dpa99c/cordova-plugin-firebasex プラグインがファイルコピーしてくれる。
1 | $ mv ~/Downloads/google-services.json src-cordova/ |
Firebase SDK の追加
この手順も dpa99c/cordova-plugin-firebasex が自動で実施するので、ここでは行わなくてよい
.gitignore
を編集
設定ファイルを git 管理下から除外するために .gitignore
を編集
参考: ios - Firebase: Should I add GoogleService-Info.plist to .gitignore? - Stack Overflow
1 | +# Firebase |
APNs 証明書の登録
iOS でプッシュ通知を利用するために、APNs 証明書を登録する。
※FCM での APNs の構成 | Firebase によると、APNs Auth Key を使うのが最新の方法っぽいが、ここでは APNs 証明書を利用した。
キーチェーンを起動、左側の 分類
で 自分の証明書
を選択後に、push
で情報を絞り込み。対象の証明書を右クリックして 書き出す
を選択
参考: ios - Unable to export Apple production push SSL certificate in .p12 format - Stack Overflow
ファイルフォーマットを .p12
として、パスワードは適宜設定。
.p12
ファイルを作成したら、クラウドメッセージングの設定ページに移動
「iOS アプリ」の「APNs 証明書」からアップロード
iOSのプッシュ通知送信時にトークン認証が使えるようになったので調べてみた - Qiita
cordova-plugin-firebasex
の追加
src-cordova
に移動して cordova plugin add
※cordova-plugin-firebase
ではなく cordova-plugin-firebasex
(末尾に x
) なので注意。
1 | $ cd src-cordova/ |
プラグイン追加後、src-cordova/GoogleService-Info.plist
と src-cordova/google-services.json
が、それぞれ以下にコピーされているはず。
src-cordova/platforms/ios/VueCordovaPushExample/Resources/GoogleService-Info.plist
src-cordova/platforms/android/app/google-services.json
上記にファイルが無い場合は、platform rm
→ platform add
で解決するはず
1 | $ cordova platform rm android |
※cordova-plugin-firebasex
の最低要件は下記
cordova@9
(CLI)cordova-android@8
(Android platform)cordova-ios@5
(iOS platform)
ビルド設定
Android
特に設定ファイルの変更などは不要、プッシュ通知を受信するための処理を記述するだけで OK。
Firebase Console からプッシュ通知のテストを行うときに、token
が必要になる(console.log
で表示している)ので [Cordova] CordovaアプリをChromeでデバッグ(Android) - Qiita の手順を参考に、Chrome でデバッグできるようにしておく。
iOS
.eslintrc.js 設定変更
この後のビルドでエラーになるので、.eslintrc.js
を変更しておく。
(あくまでも「プッシュ通知の検証」が主目的なので、問答無用で no-console
, no-debugger
ルールを無効化している)
1 | rules: { |
Xcode 設定変更
Xcode を開いて、署名(Signing & Capabilities
-> Signing
, Signing (Debug)
)の設定を変更
1 | $ open src-cordova/platforms/ios/VueCordovaPushExample.xcworkspace/ |
変更前
変更後 (ここの内容は各自の環境によりけりだと思われる)
src-cordova/build.json 作成
CLI ビルド用に src-cordova/build.json
を作成する
まずは Identity の確認、キーチェーンを起動して apple dev
や apple distri
などで絞り込む。
この証明書名(Apple Development: Rxxxx xxxxu
や Apple Distribution: XXXX
) を控えておく。
次に Profiles で作った xxxx.mobileprovision
から UUID を抽出。
他にちゃんとしたやり方がありそうだが、今回は grep
で抽出した。
1 | $ grep -i uuid -C1 --binary-files=text vueCordovaFirebasePushDevelopmentExample.mobileprovision |
src-cordva/build.json
を作成。詳しい設定内容は Signing an App - iOS Platform Guide - Apache Cordova を参照。
1 | { |
その他参考:
- Xcode9にしたらProvisioningProfileが埋め込まれなくなって困った話 - Qiita
- support for creating Xcode9 style exportOptions.plist by jrryhrtn · Pull Request #338 · apache/cordova-ios
- Cordova CLIでiOSのアプリをパッケージングする方法 - Qiita
なお、Cordova CLIでiOSのアプリをパッケージングする方法 - Qiita 内の以下の方法で抽出した ID を build.json
に使うと、自分の環境ではビルド時にエラーとなった。
1 | $ find ~/Library/MobileDevice/Provisioning\ Profiles -type f -print0 | xargs -0 grep "App ID" |
プッシュ通知受信処理の作成
dpa99c/cordova-plugin-firebasex-test にサンプルプロジェクトがあるので、参考にしながらコードを実装。
1 | # ローカルでファイルを見たい場合は clone する |
プッシュ通知を処理するファイルを編集、今回は src/main.js
主に必要な処理は下記
- プッシュ通知可能かどうかの確認 (
hasPermission
,grantPermission
) - (テスト用) FCM Token の取得 (
getToken
) - プッシュ通知の受信ハンドラの設定 (
onMessageReceived
) - トピック 購読/購読停止 (
subscribe
,unsubscribe
)
※APNs Token の取得処理(getAPNsToken
, onApnsTokenReceived
)もあるが、この API を利用しなくてもプッシュ通知は受信できており、現時点では使いみちをうまく理解できていない。
実装詳細は src/main.js や dpa99c/cordova-plugin-firebasex-test の www/js/index.js を参照。
また、その他 API は Notifications and data messages - API を参照。
プッシュ通知の受信確認
実機接続して、プッシュ通知の動作確認。
Android
テストメッセージ受信
Android を接続、下記コマンドでアプリを起動。
1 | $ npm run cordova-serve-android |
[Cordova] CordovaアプリをChromeでデバッグ(Android) - Qiita を参考に、Chrome で Android に接続。
ログが表示されているので、FCM Token をコピーし、ホーム画面に戻っておく。
※デフォルト設定だと、バックグラウンドでないとシステム通知メッセージが表示されないため
Firebase で 拡大
→ Cloud messaging
からメッセージを送信する。
タイトルとテキストを入力し、テストメッセージを送信。
FCM Token を追加して テスト
で、テストメッセージが送信される。
設定などに問題なければ、Android でプッシュ通知を受信できるはず。
参考: メッセージハンドラの受信内容
バックグラウンドにアプリがあるときに受信
1 | { |
フォアグラウンドにアプリがあるときに受信
1 | { |
トピック受信
テストメッセージを送信
ではなく、ターゲットに トピック
を選んだ場合の受信確認。
同じように受信できれば OK。
参考: メッセージハンドラの受信内容
バックグラウンドで topic 受信。from
が /topics/xxxx
になる
1 | { |
フォアグラウンドで topic 受信。from
が /topics/xxxx
になる
1 | { |
iOS
iOS デバイスを接続し、Xcode で ビルド/デプロイ。
※Safari のインスペクタが使えなかったので、Xcode からデプロイした。Safari でデバッグできるなら CLI(npm run build-deploy-ios
)でも良い
プッシュ通知の許可ダイアログが出るはずなので Allow
を選択。
※ダイアログが出ない場合は、設定アプリ→通知→アプリ名 から通知を許可に変更
Xcode 上に FCM Token が表示されるので、Android と同様にテストメッセージやトピックの送信をテストし、受信できれば OK。
参考: メッセージハンドラの受信内容
- バックグラウンドで受信した場合
"messageType": "notification",
や"tap": "background"
が付与 - トピックでもテストメッセージでも同じフォーマットっぽい
テストメッセージ バックグラウンド受信
1 | { |
テストメッセージ フォアグラウンド受信
1 | { |
トピック バックグラウンド受信
1 | { |
トピック フォアグラウンド受信
1 | { |
フォアグラウンドでのプッシュ通知受信
Foreground notifications の通り、メッセージ内に "data": { "notification_foreground": "true" }
が含まれていると、アプリがアクティブな状態でもプッシュ通知が表示される。
1 | { |
その他、以下も読んでおいた方が良い。
サーバから下記のようなメッセージを送ると、Android/iOS で バックグラウンド/フォアグラウンド でのプッシュ通知(システム通知)が利用できるはず。
※簡単な検証はしたが、何か間違いなどあるかもなので詳細は公式参照
1 | const token = "yourToken"; |
ハマった箇所
cordova-plugin-firebase
の追加でエラー
間違えて cordova-plugin-firebase
(末尾に x
無し) をインストールすると、メンテされてないため Using "requireCordovaModule" to load non-cordova module "xcode" is not supported. Instead, add this module to your dependencies and use regular "require" to load it.
のエラーが発生(するはず)。
1 | $ cd src-cordova/ |
@ctfrancia I think this plugin isn’t actively maintained anymore
fortunately @dpa99c actively maintain and improve his fork which notably solves this issue and add other improvements dpa99c/cordova-plugin-firebasex
cordova 9.0.0 issue installing firebase ios · Issue #1033 · arnesson/cordova-plugin-firebase より引用
cordova-plugin-firebase
から移行
間違えてインストールした場合は Migrating from cordova-plugin-firebase に従い、移行コマンドを実行すれば OK
1 | # 追加済みのプラットフォームを削除 |
iOS ビルドエラー
requires a provisioning profile with the Push Notifications feature
ビルド(npm run build-deploy-ios
) で Error Domain=IDEProvisioningErrorDomain Code=9 ""VueCordovaPushExample.app" requires a provisioning profile with the Push Notifications feature." UserInfo={IDEDistributionIssueSeverity=3, NSLocalizedDescription="VueCordovaPushExample.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
のエラー。
1 | $ npm run build-deploy-ios |
以下を順番に確認していく。
- Identifiers で該当 ID を選択し、
Certificates(0)
となっていないか?
Xcode 上でビルドしたら成功しないか?
iOS デバイスを接続せずに
npm run build-deploy-ios
を実行したら成功しないか?
Xcode 上でのビルド、iOS デバイスを接続せずに CLI でビルドが成功するのであれば、src-cordova/build.json
を 作成/修正 すると解決するはず。
まとめ
- プラグインは dpa99c/cordova-plugin-firebasex を利用
- arnesson/cordova-plugin-firebase ではないので注意
- iOS の証明書周りでハマるポイントがあるので注意
その他・メモ
Firebase 以外の方法
Firebase 以外だと AWS SNS を使うのが一般解(っぽい)
- AWS SNS と Cordova を使って iOS10 で Push通知 最短手順 - Qiita
- Cordovaを利用したPush通知の実装 - クラウドインテグレーションサービス「雲斗」のブログ
FCM(Firebase Cloud Messaging) について
Cloud messaging - dpa99c/cordova-plugin-firebasex に概要がまとまっている。
- Notification messages
- Background
- OS System notification
onMessageReceived
コールバックが呼ばれて、引数にtap: "background"
が付与される
- OS System notification
- Foreground
- Not OS system notification
notification_foreground: true
を追加するとシステム通知もするっぽいonMessageReceived
コールバックが呼ばれて、引数にtap: "foreground"
が付与される
- Background
- Data messages
- 任意の Key/Value 構造でデータを送れるっぽい?
getToken
で FCM で利用するトークンの取得onTokenRefresh
で FCM で利用するトークンの取得- Firebase 側で更新される可能性があるため、
getToken
よりもonTokenRefresh
を使う方が良いっぽい? - 併用するのが良さそう??
- Firebase 側で更新される可能性があるため、
onMessageReceived
でメッセージ受信時の処理subscribe
でメッセージの購読- Firebase Console で事前にトピック作成などの作業は不要(アプリ側で
subscribe("news")
とすると自動で生成される)
- Firebase Console で事前にトピック作成などの作業は不要(アプリ側で
onMessageReceived
のコールバック関数が発火するのは、プッシュ通知をタップしたとき(iOS で確認)- 2件来ていて、そのうちの1件のみタップした場合は、タップした分に対してのみ初めてコールバック関数が動作
- iOS でユーザーインタラクション無しでコールバック関数を動作させるには
apns: payload: aps: content-available
を1
に設定(※未検証) - Android だとデフォルトでコールバック関数が発動するっぽい?(※未検証)
- 未開封のプッシュ通知を取得するような API は無いっぽい
他のプラグイン
Cloud Messaging 特化 なら chemerisuk/cordova-plugin-firebase-messaging: Cordova plugin for Firebase Cloud Messaging も良さげ?
参考文献
- Firebase
- dpa99c/cordova-plugin-firebasex: Cordova plugin for Google Firebase
- cordova-plugin-firebaseを使用したプッシュ通知 - Suguru Murakami - Medium
- Firebaseによるpush通知[cordova] - Qiita
- 【cordova】プッシュ通知を実装してみた【FCM】 | reon777のメモメモリー
- お手軽firebaseプッシュ通知証明書作成メモ - Qiita
- Android&iOSアプリでFCMメッセージを受信する|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社
- Firebase使ってみました
- FirebaseでPush Notification - 3件目 - Qiita
- その他
- Cordova iOS アプリ + phonegap-plugin-push でリモートプッシュ通知機能を実装するための全工程 - Corredor
- Push通知を自前でつくるか、SaaSを使うか - Amazon SNS, Urban Airship, PushWoosh, CORE PUSH, Fello を比較してみた - API比較.com
- [Cordova] CordovaアプリをChromeでデバッグ(Android) - Qiita
- Xcode 9 + fastlaneでもManualでipaを作る - Qiita
- iOSアプリPush通知 開発環境の作成手順まとめ – hrendoh’s tech memo
- Xcode9でxcodebuidがビルドエラーになる時の対処方法 | Is Soft ブログ -ソフトウェア開発の勘所-
- [ionic] Error code 70 / requires a provisioning profile with the Push Notifications feature. | COTeggのバケツ
- Xcode9にしたらProvisioningProfileが埋め込まれなくなって困った話 - Qiita
- Xcode 9でのexportOptions.plist - Qiita
- support for creating Xcode9 style exportOptions.plist by jrryhrtn · Pull Request #338 · apache/cordova-ios
- Cordova CLIでiOSのアプリをパッケージングする方法 - Qiita
- iOS Platform Guide - Apache Cordova
- Unable to distribute with Xcode 10 · Issue #412 · apache/cordova-ios
- zmNinja/build-auto.json at master · pliablepixels/zmNinja
- Xcode 8: xcodebuildで、Automatic Signingに対応する - Qiita
- FCM での APNs の構成 | Firebase
- iOSのプッシュ通知送信時にトークン認証が使えるようになったので調べてみた - Qiita
関連記事
- Node.js で firebase-admin を使ってサーバからプッシュ通知
- Cordova Android で iframe 内のリンクをシステムデフォルトブラウザで開く方法
- Cordova アプリに Twitter Timeline の埋め込み
- NativeScript, JsBarcode でバーコードを 生成/描画
- Cordova でアプリ名やアプリのバージョン情報などを取得
- Cordova で端末やエミュレータを指定してデプロイする
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア