個別Push通知機能の紹介
こんにちは。内藤です。
Monacaバックエンドに新しく個別Push通知機能が搭載されました。
この機能の使い方について、簡単に紹介します。
個別Push通知機能
個別Push通知機能では、特定のユーザー(またはグループ、デバイス)だけに通知を送るこ とが可能になります。たとえば、会員登録しているアプリであれば、20代女性会員だけに通知するとか、30代男性会員だけに通知するということが可能になる、ということですね。
Monacaバックエンドによる個別Push通知機能には、大きく3パターンの呼び出し方があります。
(パターンA) ユーザの絞り込み条件を指定
Monacaバックエンドのユーザのプロパティ値として任意の値を保存しておくと、それらの値をプッシュ通知のユーザ絞り込み条件に用いることができます。この場合、条件に合致するユーザに対してのみ、プッシュ通知が行われます。
(パターンB) ユーザIDを指定(複数指定可)
Monacaバックエンドの「ユーザID」を外部サーバにあらかじめ記憶しておきます。そのユーザIDのリストを指定すると、特定のユーザに対してのみ、プッシュ通知が行われます。
(パターンC) Monacaフレームワークが生成した端末IDを指定(複数指定可)
Monacaフレームワークはアプリ初回起動時にユニークな端末IDを自動生成します。この端末IDを外部サーバへ送り、独自のユーザ情報と紐付けておくことにより、特定の端末に対してのみ、プッシュ通知を行うことができます。
この記事では、パターンCついて取り上げてみます。
プロジェクトの作成と設定
まずは、Monacaの最小のプロジェクトを新しく作成します。
次に、通知機能が使えるように、以下の設定をしていきます。(これは個別Push通知でなくても、Monacaバックエンドから通知機能を使う場合には設定が必要です)
IDEの左サイドの上部にある「雲」アイコンをクリックして、「バックエンドを利用する」をクリックします。選択肢が出てくるので、「Monacaバックエンドを新規作成する」を選び新規バックエンドを作成するか、「既存のMonacaバックエンドを使用する」を選びます。
【2014/8/15追記】
現在のMonaca Backendでは、jQueryプラグインを有効化する必要はなくなりました。
以下のjQueryの有効化の記述は飛ばして、先へ進んでください。
jQueryの有効化を求めるダイアログが出てきますので、「はい」を押してプラグイン設定画面を開き、jQueryプラグインを有効化して「保存する」を押します。なお、すでにjQueryやZepto.jsを利用中のプロジェクトでは、jQueryプラグインを有効化する必要はありません。
再度、左サイトの上部にある「雲」アイコンをクリックして、次に「歯車」アイコンをクリックし、バックエンド設定を選択します。
次に、マネジメントAPIタブを開きます。
「有効にする」ボタンを押し、マネジメントAPIを有効にします。マネジメントAPIとは、HTTPS経由でJSON形式のリクエストを送るだけでご自分のサーバからMonacaバックエンドを操作できる便利なWeb APIです。個別Push通知機能を利用するためには、マネジメントAPIの有効化が必須となります。
マネジメントAPIのエンドポイントURLをテキストエディタ等に記録しておきます。
APIを呼び出すためにはまず、認証に用いるマネジメントAPIキーの発行が必要です。呼び出しを許可するクライアントマシンのIPアドレスを記述し、「作成する」ボタンを押すと、キーが発行されます。
作成されたキーをテキストエディタ等に記録しておきます。
ここまでで、IDE上での準備が完了しました。
アプリの実装
次に、アプリの方の実装に入ります。
今回は個別Push通知の基本的な実装の確認が目的なので、単に通知が来たら通知により
指定されたWebページを表示するだけの簡単なアプリを作ることにします。
この場合、index.htmlのヘッダ部分のscriptタグ内に以下を記述します。
monaca.cloud.Push.setHandler(function(data){
monaca.invokeBrowser(data.url); // Open url in default browser
});
上記は、Push通知を受け取るハンドラーで、受け取ったJSONのうち、urlで指定されたWebページをブラウザにより開きます。
また、個別Push通知用にデバイスIDを取得する必要があるので、コンソールログ(および画面)にデバイスIDを表示する機能を記述しておきます。
monaca.getDeviceId( function(deviceId) {
console.log( "deviceId = " + deviceId );
$('#deviceId').text(deviceId);
});
今回は、上記で得られるデバイスIDを用いて、サーバー側からデバイスID指定でのPush通知を送ります。このため、まずはアプリを一度起動し、コンソールログにデバイスIDが表示されることを確認して下さい。表示されたデバイスIDは、コピーして、テキストエディタ等に記録しておきます。
なお、実際のアプリ開発では、デバイスIDはAjaxなどであらかじめサーバー側に送っておき、Push通知時にその値を利用することになります。
さて、これでアプリの実装が完成しました。
サーバー側の準備
それでは、実際にマネジメントAPIを呼び出し、個別Push通知を行ってみましょう。ここで利用するAPI名は、Push.sendです。
今回は簡単のため、Monacaバックエン ドのマネジメントAPIを直接ターミナルから呼び出してみます。
このAPIを使う場合、Push通知プロジェクトIDが必要になります。IDEからバックエンドの「歯車」アイコンを押して、プッシュ通知タブを開き、ページ一番下の「プッシュ通知プロジェクトID」をテキストエディタ等にコピーしておきます。
呼び出すコマンドは以下のようになります。
iOSデバッガー宛ての場合
curl https://cloud.monaca.mobi/manage/json-rpc/************************ --data '{"jsonrpc": "2.0", "id": 1, "method": "Push.send" , "params": { "pushProjectId": "【プッシュ通知プロジェクトID】", "platform": "ios", "target": "debugger", "buildType": "debug", "message": "manage sample" , "json" : "{ \"url\" : \"http://www.google.co.jp\" }", "deviceIdList": [ "【デバイスID】" ] } }' --header 'X-Monaca-Backend-Management-API-Key: ************'
Androidデバッガー宛ての場合
curl https://cloud.monaca.mobi/manage/json-rpc/************************ --data '{"jsonrpc": "2.0", "id": 1, "method": "Push.send" , "params": { "pushProjectId": "【プッシュ通知プロジェクトID】", "platform": "android", "target": "debugger", "buildType": "debug", "title": "hello", "message": "manage sample" , "json" : "{ \"url\" : \"http://www.google.co.jp\" }", "deviceIdList": [ "【デバイスID】" ] } }' --header 'X-Monaca-Backend-Management-API-Key: ************'
マネジメントAPIのリクエストボディはJSON形式で指定しますが「"jsonrpc": "2.0", "id": 1」の部分は固定ですので、重要なのは「"method": ... , "params": ...」の部分となります。****になっている部分は、マネジメントAPIのエンドポイントURLとキーの値を記述して下さい。
マネジメントAPIの呼び出しに成功すると
{"jsonrpc":"2.0","id":1,"result":{"queueIdList":["【キューのID】"]}}
といったレスポンスが返ってきます。
存在しないデバイスIDを指定すると、以下のようなエラーが返ってきます。
{"jsonrpc":"2.0","id":1,"error":{"code":-32603,"message":"Internal error: \"Failed to add to push queue: There are no target devices.\""}}
エラーが生じた場合は、paramsの指定に問題がないかチェックしてみてください。
デバイス側にPush通知が届くと、通知エリアに通知が表示されます。
それをタップすると、アプリがフォアグラウンドに立ち 上がり、ハンドラー関数が実行されます。
以上のように、個別Push通知機能を簡単に実現することが出来ました。
ぜひ、この記事を参考に、個別Push通知機能の実装を試してみて下さい。
他のパターンについて
今回は、最初に述べた3つのパターンのうち、パターンCを取り上げました。パターンA、パターンBの場合も設定等は同じになりますが、サーバ側から呼び出すパラメータ(params)が変わります。
パターンAの場合
userQuery : string
userQueryBindParams : Array
userQueryにMonaQL形式のクエリ文字列を記述します。userQueryBindParamsに、userQuery内のプレースホルダ「?」に埋め込まれる値のリストを記述します。
パターンBの場合
userOidList : string[]
userOidListに、ユーザIDのリストを記述します。
パターンCの場合(今回の記事)
deviceIdList : string[]
deviceIdListに、デバイスIDのリストを記述します。
ビルドアプリ宛ての場合
デバッガーではなく、ビルドアプリの場合には、IDE上からプッシュ通知の設定がもう少し必要になります。詳しくは
http://docs.monaca.mobi/ja/manual/backend/push_config/gcm/#android-app-push-settings
http://docs.monaca.mobi/ja/manual/backend/push_config/apns/#ios-app-push-settings
を参照して下さい。