ニフクラmBaaSお役立ちブログ

スマホアプリ開発にニフクラmBaaS。アプリ開発に役立つ情報をおとどけ!

Parse.comのプッシュ通知をニフティクラウド mobile backendに移行してみる(iOS編)

Parse.comが1年後に終了とアナウンスされています。それもあって、データストアやプッシュ通知を移行しようと考えている方も多いでしょう。

ニフティクラウド mobile backendは月200万プッシュまで無料で利用ができます。これまでの運用がその範囲であれば、無料で使える私たちのサービスをぜひ検討してください。

今回はParse.comからニフティクラウド mobile backendへプッシュ通知を移行する手順について紹介したいと思います。まだ改善すべき点がいくつか残っている点をあらかじめお伝えします。

証明書は同じものが使えます

Parse.comで使うのはp12のファイルで、ニフティクラウド mobile backendでも同じファイルが利用できます。

データを移行する

Parse.comからデータを取り出す際にはNode.jsのSDKを使います。Node.jsプロジェクトでよく使うpackage.jsonは次のようになります。

{
  "name": "parse_to_ncmb",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ncmb": "^2.0.2",
    "parse": "^1.7.0"
  }
}

これで npm install を実行します。

ライブラリの修正

現在のニフティクラウド mobile backendのJavaScript SDKはプッシュ通知の登録には対応していないため、 ncmb/lib/installation.jsに修正を加えます。以下のコードを Installation.prototype.delete の上あたりに追加します。

/**
* オブジェクトを保存します。
*
* @method save
* @param {function} callback コールバック関数
* @return this
*/
Installation.prototype.save = function(callback){
  return ncmb.request({
    path: "/" + ncmb.version + this.className,
    method: "POST",
    data: this
  }).then(function(data){
    var obj = null;
    try{
      obj = JSON.parse(data);
    }catch(err){
      throw err;
    }
    objectAssign(this, obj);
    Object.keys(this).forEach(function (key) {
      if(this[key] && this[key].__op) delete this[key];
    }.bind(this));

    if(callback) return callback(null, this);
    return this;
  }.bind(this)).catch(function(err){
    if(callback) return callback(err, null);
    throw err;
  });
};

加えて 16行目あたりの reserved を修正します。

// saveを追加します
var reserved = [
  "save", "update", "delete", "className"
  ];

これで準備は完了です。

移行スクリプトについて

移行時には下記のキーが必要です。

  • Parse.com
    • アプリケーションキー
    • JavaScript用キー
    • マスターキー
  • ニフティクラウド mobile backend
    • アプリケーションキー
    • クライアントキー
var Parse = require('parse/node');
var NCMB  = require('ncmb');

Parse.initialize("Parse.comのアプリケーションキー",
  "Parse.comのJavaScript用キー",
  "Parse.comのマスターキー"
);
Parse.Cloud.useMasterKey();

var ncmb = new NCMB("アプリケーションキー", "クライアントキー"");

// 移行するカラム
var columns = ["GCMSenderId", "deviceToken", "localeIdentifier", 
                "badge", "parseVersion", "ACL", "appIdentifier",
                "appName", "deviceType", "channels", "pushType",
                "installationId", "appVersion", "timeZone",
];

// Parse.comを検索
var query = new Parse.Query(Parse.Installation);
query.find({
  success: function(installations) {
    // 検索に出てきたデータを移行
    for (var i = 0; i < installations.length; ++i) {
      var push_data = {};
      for (var j = 0; j < columns.length; j++) {
        push_data[columns[j]] = installations[i].get(columns[j]);
      }
      
      // アプリケーション名は統一
      push_data["applicationName"] = push_data["appName"];
      var push = new ncmb.Installation(push_data);
      push.save().then(function(obj) {
        console.log("save successful", obj);
      })
      .catch(function(err) {
        console.log("Error", err);
      })
    }
  }
});

これでデータが移行されます。

プッシュ通知を送る

プッシュ通知のデバイストークンと証明書が適切に移行できていればプッシュ通知が送れるはずです。


現状の問題点としては、ライブラリの修正が必須であったり、大量のデータを移行する際の問題(タイムアウトやParse.comから取り出せる最大件数など)、独自に追加したカラムデータの移行などが問題になりそうです。それらは上記スクリプトを修正してください。

このスクリプトをベースにParse.comからの移行を検討してみてください。