Onsen UI + Vueでニフクラmobile backendを使ってみました

Monacaで作成したOnsen UI + Vueプロジェクトからニフクラmobile backendのデータストア機能を使ってみました。

NCMBライブラリのインストールのしかたや注意点については、以下の記事で解説されています。

MonacaのVueプロジェクトでNCMBを利用する際の注意点

この記事に従い以下の2点を実施します。

ちなみに、Vue向けのNCMBは v2.2.1 をベースにしているようですが、本家のNCMBは現時点で v3.0.2 になっています。Vue向けのNCMBの利用時は変更履歴を一読しておくといいと思います。

次に、ニフクラのドメイン変更に対応する必要があります。lib/ncmb.jsの2か所を書き換えます。

変更前

this.fqdn             = config.fqdn || "mb.api.cloud.nifty.com";
this.scriptFqdn       = config.scriptFqdn || "script.mb.api.cloud.nifty.com";

変更後

this.fqdn             = config.fqdn || "mbaas.api.nifcloud.com";
this.scriptFqdn       = config.scriptFqdn || "script.mbaas.api.nifcloud.com";

以上で、ニフクラmobile backendが利用可能になります。最後にデータストア機能を利用する場合の一例を示します。

const NCMB = require('ncmb')
const store = {
  param: {
    ncmb: null,
  },
  initBackend () {
    const applicationKey = "0123456789 ..."
    const clientKey = "0123456789 ..."
    this.param.ncmb = new NCMB(applicationKey, clientKey)
  },
  saveBackend () {
    if (!this.param.ncmb) {
      console.log("ニフクラ初期化エラー")
      return
    }
    var MdtRecords = this.param.ncmb.DataStore("MdtRecords")
    var mdtrecords = new MdtRecords()
    var dateObj = {
      y: this.param.recordData.date.y,
      m: this.param.recordData.date.m,
      d: this.param.recordData.date.d,
      w: this.param.recordData.date.w,
      t: this.param.recordData.total
    }
    mdtrecords.set("dateObj", dateObj)
      .save()
      .then(mdtrecords => {
        this.param.backendLoad = true
      })
      .catch(function(err) {
        console.log("保存に失敗しました。エラー: " + err)
      })
  },
  loadBackend (callback) {
    if (!this.param.ncmb) {
      console.log("ニフクラ初期化エラー")
      callback(null)
      return
    }
    var MdtRecords = this.param.ncmb.DataStore("MdtRecords")
    MdtRecords.order("createDate", true)
      .limit(10)
      .fetchAll()
      .then(results => {
        this.param.backendLoad = false
        this.param.backendData = results
        callback(results)
      })
      .catch(function(error) {
        callback(null)
      })
  },
}

Meditation Note v2.0.0 アップデート

瞑想サポートアプリ Meditation Note のアップデートを行いました。

V2.0.0 アップデート内容

  • グラフ画面を改良しました。
  • メモ、コメント入力、日付形式設定を削除しました。
  • アプリ外観のブラッシュアップを行いました。

他に背景画像の軽量化や最新の記録の表示なども行いました。今回のアップデートでは既存の機能や外観を見直し、よりシンプルな操作性を目指しました。

また、本アプリでは瞑想の継続や習慣化をサポートするしくみとしてニフクラ mobile backend を利用して瞑想記録の共有を行っているのですが、2019年10月 1日からニフクラのドメインが変更になったため、これに対応しました(これがアップデートのほんとうの理由だったり)。

よろしければご利用ください。

Google Play で手に入れよう

Cordova NativeStorageプラグインでデータを保存

NativeStorageプラグインを使用するとアプリのデータを永続的に保存できます。Androidの場合はSharedPreferences、iOSの場合はNSUserDefaultsを利用します。データはローカルストレージ(LocalStorage)と同様にKey-Value形式で扱います。

NativeStorageプラグイン: cordova-plugin-nativestorage

API

const key = "message";
const value = "hello";
const successCallback => console.log("success");
const errorCallback => console.log("error");

// 保存
NativeStorage.setItem(key, value, successCallback, errorCallback);

// 読み出し
NativeStorage.getItem(key, successCallback, errorCallback);

// 読み出し(全キー)
NativeStorage.keys(successCallback, errorCallback);

// 削除
NativeStorage.remove(key, successCallback, errorCallback);

// 全削除
NativeStorage.clear(successCallback, errorCallback);

動作確認サンプル

<body>
  <div id="container">
    <ons-button onclick="onLoad()">Load</ons-button>
    <ons-button onclick="onSave()">Save</ons-button>
  </div>
</body>
// key
const KEY_NUMBERS = "nsNums";
const KEY_RECORDS = "nsRecords";

// value
const numbers = [100, 200, 300, 400, 500];  // 配列
const records = {     // オブジェクト
  "date": {
    "year": 2019,
    "month": 11,
    "day": 16,
    "week": 1
  },
  "time": [
    {"hour": 7, "min": 10},
    {"hour": 9, "min": 20},
    {"hour": 11, "min": 30},
    {"hour": 15, "min": 40},
    {"hour": 20, "min": 50}
  ]
};

ons.ready(function () {   // devicereadyイベント
  console.log("*** ons.ready ***");
  console.log(window.NativeStorage);
})

function onLoad () {
  console.log("*** onLoad ***");

  NativeStorage.getItem(KEY_NUMBERS, 
    obj => console.log("success", obj),
    err => console.log("error", err.code));

  console.log("check1");

  NativeStorage.getItem(KEY_RECORDS, 
    obj => console.log("success", obj),
    err => console.log("error", err.code));

  console.log("check2");
}

function onSave () {
  console.log("*** onSave ***");
  
  NativeStorage.setItem(KEY_NUMBERS, numbers,
    obj => console.log("success", obj),
    err => console.log("error", err.code));

  console.log("check1");

  NativeStorage.setItem(KEY_RECORDS, records, 
    obj => console.log("success", obj),
    err => console.log("error", err.code));

  console.log("check2");
}

console 出力

ローカルストレージとの相違点

アプリ起動時の読み込み

  • Cordovaの初期化が終わってから(devicereadyイベントリスナ―やons.ready()メソッドで)実行する
  • ローカルストレージの場合はどこで読み込んでもよい

非同期処理

  • データを読み出した後の処理はコールバックで行う
  • 複数のキーを順に呼び出したりFile APIのような非同期処理を続けて行うときはPromiseなどを使用するとソースコードが見やすくなる
  • ローカルストレージの場合は同期処理なので記述した順番に実行される

データ形式

  • オブジェクトや配列のデータを保存したり読み出したりする場合、そのままの形式で扱うことができる
  • ローカルストレージの場合はJSON形式の文字列で扱う必要がある(保存する前にJSON.stringify()で文字列に、読み出した後はJSON.parse()でオブジェクトに変換)

Note

SharedPreferencesへのアクセスモードはMODE_PRIVATE固定

NativeStorageプラグインでは他のアプリとのデータ共有は不可。そもそもSharedPreferences APIではAPI level23からMODE_MULTI_PROCESSがサポートされなくなったため、データ共有したい場合はSharedPreferencesの替わりにContentProviderなどを使用する必要がある。

アプリを再インストールしてもデータが消えない

アプリをアンインストールした後に再インストールした場合、SharedPreferencesに保存したデータは自動的に復元される。保存したデータが設定値であれば再設定する手間が省けるなど便利な面もあるが、スコアや過去の日付のような初期化したいデータの場合はクリーンな状態から始めることができなくなる。

これは、Androidの自動バックアップ機能が原因。

この機能により、SharedPreferencesがGoogle Driveへ自動的に保存され、再インストールしたときに自動的に復元される。この機能を無効化するには、アプリのマニフェストファイルにandroid:allowBackup=”false”を記述する。Monacaを使用している場合はAndroidManifest.xmlの替わりにconfig.xmlとCustom Configプラグインを使用する。