FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

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

iOSからスクリプト機能を呼び出す

3月にリリースされたスクリプト機能を使ってiOS側からコードを実行してみたいと思います。今回はデータストアに保存する際に、事前に入力チェックを行うスクリプトとしてみます。

サーバ側にアップロードするコードについて

今回アップロードするコードは次のようになります。データストアでItemクラスを定義し、受け取った内容 req.body.item を使ってItemクラスのインスタンスを生成します。そして入力チェックを行い(nameに値が入っているかどうか)、エラーだった場合はHTTPステータス400でエラーを返します。エラーがない場合はデータを保存し、そのオブジェクトを返します。

YOUR_APPLICATION_KEY、YOUR_CLIENT_KEYはそれぞれ自分のキーに変更してください。

var NCMB = require('ncmb');
module.exports = function(req, res) {
  var application_key = 'YOUR_APPLICATION_KEY';
  var client_key      = 'YOUR_CLIENT_KEY';

  var ncmb = new NCMB(application_key, client_key);
  var Item = ncmb.DataStore('Item');
  var item = new Item(req.body.item);
  if (emptyString(item.get("name"))) {
    return res.status(400).json({
      "error": "Name is required."
    });
  }
  item.save()
    .then(function(obj) {
      return res.status(201).json(obj);
    })
    .catch(function(err) {
      return res.status(503).json(err);
    });
};

function emptyString(value) {
  if (typeof value === 'undefined')
    return true;
  if (value === null)
    return true;
  if (value === "")
    return true;
  return false;
}

注意点としては、エラー時には error というキーにメッセージを入れて返してください。この error はiOS SDK側で使っています。

iOS側のコード

ではアプリ側のコードです。今回はSwiftで書いてみました。Objective-Cのコードはスクリプト (iOS) : 基本的な使い方 | ニフティクラウド mobile backendを参考にしてください。

let application_key = "YOUR_APPLICATION_KEY"
let client_key = "YOUR_CLIENT_KEY"
NCMB.setApplicationKey(application_key, clientKey: client_key)

let script = NCMBScript.init(name: "ItemSave.js", method: NCMBScriptRequestMethod.ExecuteWithPostMethod)

let dic: [NSObject: AnyObject] = ["item": ["message": "Hello World", "name": "Test"]]
script.execute(dic, headers: nil, queries: nil,
    withBlock: {(data, err) -> Void in
    // print(err)
    print(data)
})

注意点としては、HTTPメソッドを定義するところは、

  • GET: NCMBScriptRequestMethod.ExecuteWithGetMethod
  • POST: NCMBScriptRequestMethod.ExecuteWithPostMethod
  • PUT: NCMBScriptRequestMethod.ExecuteWithPutMethod
  • DELETE: NCMBScriptRequestMethod.ExecuteWithDeleteMethod

として定義する必要があるということです。

また、データを渡す部分ですが、NCMBObjectを使うことはできませんでした。そのため、データをAnyObjectとして定義する必要があります。

script.executeではデータの他、ヘッダーとクエリーを渡すことができます。そしてwithBlockにコールバックが返ってきますので、errオブジェクトがnilであるかどうかでエラー判定を行います。

今回、エラーでない場合はItemクラスのJSONデータが返ってきます。後はこれを使ってNCMBObjectを作成できます。


サーバ側のコードはAndroidやJavaScript、Unity SDKとも共通で利用ができます。入力値の検証など、複雑なロジックをサーバ側に持たせることでアプリ側が簡素化できるようになります。ぜひ試してみてください。