前回に続き、OutSystemsでのWebアプリケーション開発経験はある方向けに、OutSystemsでのモバイル開発がWebとどう違うのかをざっと説明します。
基本的に、OutSystemsのWeb開発のスキルでモバイルも開発できます。差分だけ把握すれば、モバイル開発も難しいことはないです。
今回は、大きな相違点の2つめ、オフライン機能です。
Table of Contents
概要
モバイルアプリケーションは、基本的にはモバイル端末内部だけで動作し、必要なときにOutSystemsサーバに通信します。
必要なときとはどんなときかというと、ログイン、権限チェック(ロールに入っているか)、サーバロジックの呼び出し(Server Actionと言います。後述)などです。
それ以外の時は、端末内に作成したLocalDBと端末内ロジックの呼び出し(Client Action)です。
端末内の動作について
LocalDB
OutSystemsのアプリケーションは、通常、サーバ内のDB(SQL ServerやOracle)内にデータを持ちます。この点はモバイルアプリケーションでも同じです。
ただし、サーバ内のデータのコピーを持ったり、クライアントで発生するデータを保持するのに使えるLocalDBというものがモバイルアプリケーションにはあります。
作り方はサーバ内のDBと同じです。Local Storageを右クリックしてAdd Entityです。
サーバ内のDBのコピーを保持する場合は、Add Entity from Databaseを選択すると、サーバEntityから必要な列だけを選択して定義のコピーを作成できます。
こうして作成したLocalDBは、Publishすると、ユーザの端末内でsqliteのDBとして保持されますが、OutSystems開発者はsqliteであることを意識する必要は無いです。いくつかの違いはありますが、サーバのEntityと同様にプログラムできます。
Client Action
モバイルアプリケーションのLogicタブの下には、Client Actionsというフォルダがあります。
ここに作るActionをClient Actionと呼び、デフォルトでは白抜きの○のアイコンで表されます。従来のWebアプリケーション開発でも利用していたサーバ側のActionはServer Actionと言います。
このActionは動作時にはJavaScriptに自動変換され、モバイル端末内部だけで動作します。
Action内部の実装方法はWebアプリケーションで作成するActionと基本的には同じですが、Run Server Actionという要素を配置することで、Server Actionsにあるサーバ側ロジックを呼び出すことができます。
このとき、どのように動作するかというと、JavaScriptに変換されたClient ActionのロジックからREST API的にサーバ側ロジックを呼び出すようになります。
下の例は、ServerDataSyncというサーバ側ロジックを呼び出しています。
データの取得について
LocalDBからデータを取得するとき、Action内でAggregate呼ぶこともできますが、Screen自体にAggregateをぶら下げることが多いのではないでしょうか。
Screenを右クリックしてFetch Data from Local Storageで作れます。このAggregateのデータとUIは非同期に結びつくので、例えばExpressionのValueに「Employees.List.Current.Sample_Employee.FirstName」(ListItemに設定する場合)と設定しておくと、データが取得できた段階で自動的にその値が表示されます。
なお、モバイルアプリケーション画面にはPreparationがないので注意してください。WebではPreparationで取得していたAggregateを、Screenにぶら下げたAggregateで代替するイメージ。
モバイルアプリケーションのイベントについては、以下を参照してください。
Screen and Block Lifecycle Events
同期処理
同期処理とは、ここでは、サーバ側にある従来のEntityと、LocalDBにあるEntity間でデータをコピーする処理を指します。
OutSystemsが提供する同期処理
上にある図をもう一度出します。
これが、OutSystemsが標準提供する同期処理です。
OfflineDataSync
これが同期処理の本体です。
ここにアプリケーション要件に従った同期ロジック(クライアント側)を書いていきます。サーバ側で動くロジックは、
ここからServer Actions/OfflineDataSync/ServerDataSyncというServer Actionが呼び出されるのでそちらで書きます。
OfflineDataSyncConfiguration
OutSystemsは一定のタイミングで同期処理を自動実行するように設定できます。
その設定をするのがこのActionです。
対応しているのは、オフラインからオンラインになったとき、アプリケーションが中断から復帰したとき、ログインしたときです。
それぞれに対応するAssignがあるので、自動同期したいタイミングのAssignで値をTrueに設定してください。
TriggerOfflineDataSync
同期を任意に開始するためのAction。
自動同期とは別のタイミングで同期を開始したいとき、他のActionのフローの中にこのActionを配置することで同期が開始されます。
同期処理実装のTips
いかにも面倒な実装が必要そうですが、OutSystemsが提供する支援機能があるので、特殊な処理が必要なければ簡単です。
LocalDBのEntityを右クリックすると、Create Action to Sync Dataというメニューがあるのでこれを選択しましょう。
同期ロジックのひな形を自動作成してくれます。まずこの方法でロジックを作成し、必要な部分だけ修正するのがいいと思います。
Read-OnlyはサーバのデータをLocalDBにコピーするだけの場合、LocalDBで変更されたデータをサーバに反映する必要がある場合はRead/Writeですね。
ここでできるのは、1Entity分の同期ロジックなので、これをOfflineDataSyncなどから呼ぶようにします。
同期処理のイベントハンドラーを書きたい場合は、Common/OfflineDataSyncEvents Blockにイベントがあります。Layout Blockに配置済みです。