Nifty Cloud Mobile Backendでプッシュ通知のお話

こんにちは増島です!

先日シン・ゴジラを見たのですが、僕の生活圏内の街がことごとく破壊されていたのでとてもショックでした。

話は変わりますが、作成しているアプリでNifty Cloud Mobile Backendを使用しています。プッシュ通知の実装の機会があったので、今回はその話をします!

環境

【ネイティブ】
iOS
【サーバサイド】
Node.js

はじめに

Mobile Backendのコンソールから手作業でプッシュ通知を送ることもできますが、
今回の例はサーバ側のイベントをトリガーに対象を絞ってプッシュ通知を送る例です。

証明書の登録やデバイストークン取得処理については今回触れません。 それらについては下記のページをご参照下さい。

http://mb.cloud.nifty.com/doc/current/push/basic_usage_ios.html

デバイストークンとユーザIDの紐付け

今回のアプリではユーザ毎のユニークIDを自前のサーバで管理しています。プッシュ通知を送る対象のフィルタリングにあたってこちらのIDとNifty側で管理しているデバイストークンの紐付けが必要でした。

Niftyのコンソールで見ると各端末のデバイストークンなどはinstallationというテーブルに保持されている事がわかります。

  • 端末のinstallation情報を取得する

iOS

let currentInstallation = NCMBInstallation.currentInstallation()  

currentInstallationを取得すると、この端末のinstallation情報が取れます。このオブジェクトにはデバイストークンやデバイスタイプ(iOS,Androidなど)などのプロパティを持っています。

  • installationに独自フィールドを追加する
currentInstallation.setObject("ここにアプリで管理してるユーザID", forKey:"userName")  
    currentInstallation.saveInBackgroundWithBlock{
      (error: NSError?) in
      // エラー時の処理
    }

先ほど取得したcurrentInstallationのsetObjectメソッドを呼びだして、アプリ側で管理しているIDをinstallationに登録します。このようにinstallationには任意のキー名で独自フィールドを追加することが出来ます。

登録に成功すると新たにuserNameというフィールドが追加され、指定した値が追加されます。

対象を絞ってプッシュ通知を送る

それでは実際にプッシュ通知を登録するところを見てみましょう! 下記がサーバ側に実装したNiftyにプッシュ通知を登録するためのモジュールです。

NiftyではREST APIも提供されており、そちらを使ってPush通知登録することも可能ですが、今回のケースではNiftyのクライアントSDKを使用しています。

Node.js

package.json

{
・
・
・
  "dependencies": {
    "ncmb": "2.1.0"
  }
}

NiftyPushService.js

'use strict';

const NCMB = require('ncmb');  
const logger = require('../logs/logger');  
const config = require('config');  
const APIKey = config.niftyAPIKey;  
const ClientKey = config.niftyClientKey;

class NiftyPushService {  
    notification(userId) {
        const ncmb = new NCMB(APIKey, ClientKey);
        const push = new ncmb.Push();
        const message = 'プッシュ通知が届きました!';
        push.set('immediateDeliveryFlag', true)
            .set('message', message)
            .set('target', ['ios'])
            .set('sound', 'default')
            .set('userSettingValue', {'param1':'パラメータだよ!'})
            .set('searchCondition', {'userName' : userId});
        push.send()
            .then(function(push){
                // 送信後処理
                logger.info('Nifty Push Success');
            })
            .catch(function(err){
                // エラー時の処理
                logger.error(err);
                logger.info('Nifty Push Error');
            });
    }
}

module.exports = NiftyPushService;  
  • オブジェクトの生成

登録時に発行されたAPIキーとクライアントキーを指定してncmbを生成後、Pushオブジェクトを生成します。

const ncmb = new NCMB(APIKey, ClientKey);  
const push = new ncmb.Push();  
  • 設定情報の追加

続いてプッシュ通知を送る際の設定情報を追加します。APNSに送るペイロード情報もここで指定します。

push.set('immediateDeliveryFlag', true)  
    .set('message', message)
    .set('target', ['ios'])
    .set('sound', 'default')
    .set('userSettingValue', {'param1':'パラメータだよ!'})
    .set('searchCondition', {'userName' : userId});
  • 検索条件の設定

送る対象をフィルタリングするのは下記の部分になります。
先ほど追加した独自フィールドの"userName"を検索条件に指定しています。

これによりuserNameに設定されている値とuserIdが同じinstallationの端末にのみプッシュ通知が送られます。

.set('searchCondition', {'userName' : userId});
  • アプリ側で使用するパラメータの設定

userSettingaValueに設定した値をアプリ側でuserInfoなどのパラメータ情報から取得することが出来ます。

.set('userSettingValue', {'param1':'パラメータだよ!'})
  • 通知登録の実行
push.send()  
    .then(function(push){
    // 送信後処理
        logger.info('Nifty Push Success');
    })
    .catch(function(err){
    // エラー時の処理
        logger.error(err);
        logger.info('Nifty Push Error');
    });

登録が成功した場合コンソールのプッシュ通知タブから通知情報を見ることが出来ます。

これでプッシュ通知登録完了です!

デバイストークンなどを自前で管理するのは面倒だったりするので、プッシュ通知を使いたいという理由だけでもmbaasを使うのはありだと思いました!