Tech Sketch Bucket of Technical Chips by TIS Inc.

【後編】BaaS、Kinveyを使用したAndroidアプリ作成方法

Pocket

スマートフォンやタブレットなどのスマートデバイスが普及するにつれ、世界中で注目され始めたBaaSをご存知でしょうか?
BaaSとは簡単に言ってしまうとサーバサイドの機能を提供するサービスの事を指します。
そのBaaSの一つであるKinveyを使用したAndroidアプリの作成方法を前編後編に分けて説明したいと思います。
この記事ではKinveyのユーザー管理機能とPush通知機能の使い方を説明します。

はじめに

前回の記事 ではKinveyを使用したスケジュール管理アプリ作成という事で、Kinveyを使用するための準備とデータストアの使い方を説明しました。
今回は残りのユーザー管理機能とPush通知機能を説明したいと思います。

ユーザー管理機能

スケジュール管理アプリという事で、どのユーザーが作成したスケジュールなのかを判別しなくてはいけません。
そのためにまずユーザー情報を登録し、ログイン処理を経由してスケジュール登録を行うようにします。
Kinveyにはユーザー管理機能があり、サインアップ処理・ログイン処理がKinvey APIに定義されているのでそれを使用します。
必要なアプリ画面は ログイン画面サインアップ画面 、メニュー画面(ログイン後に表示する画面)、の3種類になります。
流れとしてはサインアップ画面でユーザー情報を登録、ログイン画面に遷移し登録した情報をKinveyに送信、登録されているユーザー情報ならメニュー画面に遷移、となります。

サインアップ

ではまずサインアップ画面から説明します。

コード解説

この関数では入力されたユーザー名とパスワードをKinveyプロジェクトのユーザーコレクションに登録する処理を行っています。

[1] サインアップ処理

登録処理はkinveyClient変数を使用しKinvey APIcom.kinvey.java.User#create() を呼び出し行っています。
create関数は引数として渡されたユーザー名とパスワードをKinveyプロジェクトのUserコレクションに登録し、処理結果によってKinveyUserCallback関数のonSuccessまたはonFailureを呼び出します。
今回は行っていませんが、実際にアプリを作成して公開する場合はパスワードを暗号化した方が良いでしょう。

[2] 登録成功時処理

onSuccessは呼び出された時点でサインアップ済みになっているので、ユーザーへの処理成功通知とサインアップ後処理に必要なデータをBundleインスタンスに格納し遷移先画面のログイン画面に渡しています。

[3] 登録失敗時処理

ユーザーへの処理失敗通知とログへの出力処理を行っています。

実行

ではこの関数の実行結果を確認してみましょう。
まずはサインアップに必要な情報を入力し、登録ボタンを押下します。
kinvey_new_project
正常に登録処理が終了すると下図のようにユーザーへの成功通知が表示されます。
kinvey_new_project
もし登録処理に失敗した場合は下図のようにユーザーへの失敗通知が表示されます。
kinvey_new_project
確認としてKinveyプロジェクトのダッシュボードを開き、 Users を選択します。
下図のようにサインアップで入力した情報のユーザーが追加されていれば成功になります。
kinvey_new_project

ログイン

次にログイン画面の説明になります。

コード解説

この関数では入力されたユーザー名とパスワードを元にログイン処理を行っています。

[1] kinveyへのログイン処理

ログイン処理はkinveyClient変数を使用しKinvey APIcom.kinvey.java.User#login() を呼び出し行っています。
login関数は引数として渡されたユーザー名とパスワードがKinveyプロジェクトのUser内の登録済みデータと一致するか検索し、その成否に応じてKinveyUserCallback関数のonSuccessまたはonFailureを呼び出します。

[2] ログイン成功時処理

onSuccessは呼び出された時点でログイン済みになっているので、ログイン後に必要な処理としてPush通知の初期化処理、ログイン後画面への遷移処理を行っています。
また、このonSuccess内でPush通知の初期化処理を行います。
kinveyClient変数を使用しKinvey APIcom.kinvey.android.push.GCMPush#initialize() を呼び出し、このアプリをPush通知対象としてKinvey側に追加します。
通知対象としての情報はKinveyプロジェクトのUser内に追加されます。
この初期化処理を行わないとPush通知の受信が出来ないため必ず行ってください。

[3] ログイン失敗時処理

onFailureではユーザーへの処理失敗通知とログへの出力処理を行っています。

実行

ではこの関数の実行結果を確認してみましょう。
まずは先ほどのサインアップで入力したユーザー名とパスワードを入力しログインボタンを押下します。
kinvey_new_project
正常にログイン処理が終了すると下図のように画面遷移が行われ、ユーザーへの成功通知が表示されます。
kinvey_new_project
もし入力した情報が正しくない場合は下図のようにユーザーへの失敗通知が表示されます。
kinvey_new_project

これでユーザー管理機能の説明は終わりです。

Push通知機能

最後にPush通知について説明します。
KinveyのPush通知機能を使用するには事前に GCM(Google Cloud Messaging for Android)Project IDAPI Key が必要になります。
GCMの使い方については こちら をご覧下さい。
KinveyのPush通知機能を使用するにはKinveyプロジェクト側、Androidアプリ側それぞれでPush通知の設定を行わなければなりません。
まずはAndroidアプリ側の設定について説明していきます。

Androidアプリ側のPush通知設定

AndroidアプリにPush受信機能を実装する場合、GCMの設定やレシーバークラス作成、AndroidManifest.xmlの編集などを行う必要があります。
では順に説明していきます。

GCM設定

Android SDK マネージャーを使用して Google Cloud Messaging for Android Library をインストールします。
インストール完了後、任意のAndroid SDKフォルダ\sdk\extras\google\gcm フォルダが作成されている事を確認します。
そのgcmフォルダ内のgcm-client\dist\gcm.jar ファイルを作成しているプロジェクトのlibsに追加します。
次にassetsフォルダ内の kinvey.properties に以下の二行を追加します。

GCMReceiverクラス作成

Receiverクラスはサーバ(今回はKinvey)と通信のやりとりをするためのクラスになります。
このアプリではKinveyとGCMを使用してPush通知を行うため、通常のBroadcastReceiverクラスではなく GCMBroadcastReceiver クラスを継承してクラスを作成します。
このGCMBroadcastReceiverクラスはGCMメッセージを受け取ると、getGCMIntentServiceClassName関数内で定義されたGCMメッセージを処理するクラスを呼び出します。

GCMLoggingReceiverクラス作成

GCMReceiverクラスによって呼び出されるGCMメッセージを処理するクラスです。
Push通知を受信するとGCMReceiverクラスを経由しこのクラスの onMessage 関数が呼ばれ、Notification作成処理を行います。
メッセージ以外にもユーザー登録完了通知やエラー通知などの処理も行えます。

AndroidManifest.xmlの変更

最後にAndroidManifestに必要なパーミッションの追加や登録を行います。
まずはパーミッションの追加です。
必要なパーミッションは以下になります。

  • android.permission.INTERNET - インターネット接続許可
  • android.permission.GET_ACCOUNTS - Android端末に設定されているアカウント情報取得許可
  • android.permission.WAKE_LOCK - 自動スリープ無効化の許可
  • 『applicationPackage』.permission.C2D_MESSAGE - 他のアプリのメッセージ登録・受信防止 ※
  • com.google.android.c2dm.permission.RECEIVE - メッセージを登録・受信

※『applicationPackage』には作成しているプロジェクトのパッケージを入れてください。

Receiverの登録

先程作成したGCMReceiverとGCMLoggingReceiverを登録します。
登録を行わないとGCMメッセージを受信するクラスとして認識されないので必ず登録してください。

実行結果

実際にPush通知が受信できるか確認します。
確認方法としてKinveyのPush通知機能の一つである Send a Push を使用します。

Send a Push機能を使用する前に1つ行わなければならない設定があります。
まずKinveyプロジェクトのAddons内の Messaging から Push を開きます。
次にConfigrationを選択しGCMの Project IDAPI Key を入力し、保存ボタンを押します。
この設定を行わないとKinveyのPush通知機能が使用ないので注意して下さい。

kinvey_new_project

これでPush通知の使用準備は終わりです。

ではPush通知を送信してみましょう。
先程と同じくKinveyプロジェクトのAddons内の Messaging から Push を開きます。
RecipientsWho gets this pushSpecific Users に変更し、登録済みユーザの名前をJSONオブジェクトで Which users に書きます。
次にMessage内に適当な文字を書き、送信ボタンを押下します。

kinvey_new_project

Androidアプリに送信したMessage内容のPush通知が表示されればOKです。

以上がアプリ側の設定になります。
次はKinvey側の設定を説明していきます。

Kinveyプロジェクト側のPush通知設定

KinveyのPush通知を行う上である問題が出てきます。
それはPush通知を「いつ」「誰に」「何を」送信するのかという問題です。

Kinveyには先程使用した Send a Push という簡単にPush通知を行える機能がありますが、この機能はPush通知を行う度に、対象ユーザの指定や送信する内容の指定、Push通知の送信を全て手動で行う必要があります。
これでは一定時間毎にPush送信する場合や特定タイミングでPush送信する場合、夜中にPush送信する場合などに、アプリ管理者に大きな負担が掛かってしまいます。
そのため今回作成するスケジュール管理アプリのように送信タイミングが不確定なPush通知には使用しづらいと言えます。

そこで 今回は Business Logic というサーバ側で動作する関数を使用します。
このBusiness LogicにKinveyのDataStoreに登録されたスケジュール情報を元に「いつ」「誰に」「何を」送信するのか判断する機能を作成します。
また、 Custom Endpoints という特定のURLを叩いた際にBusiness Logicを呼び出す機能も使用します。
Business LogicはJavaScriptを使用して作成します。

Business Logicに実装する機能としては

  • Business Logic実行者が正しいか確認
  • データストア内に登録されているスケジュールから通知条件に当てはまるものを検索
  • スケジュール登録者にスケジュールをPush通知
  • 重複送信防止フラグの変更

になります。
では実際にコードを見てみましょう。

解説

[1] パスワード検査

セキュリティ強化のためにパスワードを設定します。
関数呼び出し側のパスワードは request.body.password に格納されているのでそれと比較し、もしパスワードが違っていた場合は response.complete() 関数でHTTP StatusCodeの401を返して処理を終了します。

[2] 検索条件時間を作成

引数として渡されるmodules変数はBusiness Logicで使用できる様々なJavaScriptライブラリ変数になります。
moment.jsを使用した日付取得関数であるmodules.momentを使用して検索条件の日時を作成します。
この時に以下の事に気をつけます。

  • 日付と時間は変数を分けないと正常にfind関数が動作しない
  • moment関数で取得できる時間はUTCのため、日本時間が必要な場合は+9時間する

また今回はスケジュールに登録されている時間の5分前に通知処理を行いたいので検索条件時間に add("minutes", 5) しています。

[3] データストアから条件に一致するデータを検索

collectionAccess.collection('ScheduleManager').find()関数を使用しデータストアから検索条件に一致するスケジュールを探します。
検索結果はCallBack関数に配列として渡されます。

[4] push通知対象ユーザー情報取得

検索条件に一致したスケジュールの作成者情報(ユーザー情報)を取得します。
このユーザー情報を使用してPush通知関数を呼び出します。

[5] push通知送信処理

[3] で取得したPush対象データと [4] で取得したユーザー情報を引数に push.send() 関数を呼び出します。
関数呼出し後、push対象データのpush通知済みフラグをtrueに変更し、重複送信を防止します。

以上がBusiness Logicの説明になります。

実行結果

今回はCustom Endpointsの呼び出しをKinveyプロジェクトのコンソール画面から行いBusiness Logicを実行します。
KinveyプロジェクトのAddons内の Developer Tools から API Console を開き、画面左に作成したCustom Endpointsが表示されているのでそれをクリックします。

Request bodyにパスワードを入力し送信ボタンを押します。
kinvey_new_project
画面に下図のようにレスポンスが表示されれば送信成功です。
kinvey_new_project
最後にAndroid側でスケジュールが受信されているか確認します。
kinvey_new_project

まとめ

Kinveyを使用してみた感想は「便利!!」の一言でした。
本来であればサーバを用意し必要な設定などを行ってようやく使用可能になる機能が、Kinveyにサインアップするだけで使用できるというのは衝撃的でした。
Kinveyのデフォルト機能だけで十分なアプリが組めますし、JavaScriptが書けるならばサーバ側の追加機能も作成しやすく、アプリ開発初心者から上級者まで幅広く利用できるサービスなのではないか、と思いました。

以下に筆者が考えるKinveyのメリット・デメリットをまとめてみました。

メリット

  • フロントエンドの技術だけでサーバ連携アプリが作れる
  • サーバの運用を考えなくて良い

デメリット

  • アプリの規模によって毎月使用料が発生する
  • サーバの物理的なカスタマイズが出来ない

Kinveyの大きなメリットはやはりフロントエンドの技術だけでサーバ連携アプリが作れる事でしょう。

企業や個人でも利用でき、今後ますます注目度が増すであろうBaaSを皆さんも触ってみてはいかがでしょうか?
この記事が役に立てば幸いです。

エンジニア採用中!私たちと一緒に働いてみませんか?