で見たように、ODCのMobile Appには新しいSystem Event "OnSync"が追加された。この記事ではその関連について動作確認しておく。
環境情報
ODC Studio (Version 1.5.38)
ネイティブビルドするのは大変なので、PWAとしてiPhone上で動作確認する。
ドキュメント
Sync framework reference - Screens and Blocks sync events
OnSync ActionのInput Parameter "Context"
UI関連のEventドキュメントの記述から判断すると、
- OnSync内には複数の同期ロジックパターンが組みこむ
- パターンはEntityやその塊で分類されている
- OnSync Actionは受け取ったContextに応じてどの同期ロジックを動かすのか決める
という動作をする。つまり、パターンが分かれない場合は、Contextは指定なしでもよさそう。
Context : String input parameter that can be passed from business logic to the sync actions. Useful for deciding which entity to sync.
(Screens and Blocks sync eventsより)
ContextはText型なのでEntity名等を渡せばよさそう。
以降の検証の中で、Contextとしてどういう値を受け取っているかを記録に残すため、On Sync Action先頭で以下の内容(Contextの値と実行日時)をLocal VariableにAssignしておき、Actionの最後でMessageに表示させた。
"On Sync開始(Context=" + Context + ", 実行日時=" + FormatDateTime(CurrDateTime(), "yyyyMMdd HH:mm:ss")
App PropertyによるEvent Trigger
前回の記事では確認しなかった。OnSyncは、Action Flowからの明示的呼び出し以外に、AppのPropertyで設定したタイミングでの自動的なTriggerもされる。
ODC StudioでAppを開き、①画面左上、ハンバーガーメニューの右隣のドロップダウンを展開すると、②AppのPropertyを設定するダイアログ(Edit app properties)が表示されるのでMobileタブを開く。③Offline Data Syncというエリアで設定を行う。
OnSyncを発生させるタイミングはOn Online(ネットワークがオフからオンになったとき)とOn Resume(Appがバックグラウンドからフォアグラウンドに来たとき)の2種類ある。チェックボックスがもう1つあるが、それはOnSyncでエラーが発生した時にリトライするかどうか、のようだ。
ここではOn OnlineとOn Resumeをオンにして動作を確認してみる。
On Onlineのテストは、端末上部から下にスワイプすると出てくるコントロールセンターで、飛行機のアイコンをオン→オフ→オンにする(機内モードを切ってから入れ直す)と発生する。
On ResumeはAppを表示した状態から、Home Screenに切り替え、もう一度Appに戻ってくると発生する。
いずれのイベントも、以下の形式のメッセージ。Contextの値が空であるから、自動で発生するタイプのイベントでは、OnSyncのInput Parameter Contextは空文字列で呼び出されるようだ。
On Sync開始(Context=, 実行日時=2025-917 22:40:28)
UIでの関連Event
Block・Screen共にOnSync関連のEventを持つ。
OnSyncStart, OnSyncComplete, OnSync Errorの3つ。

Event Handlerを設定してみたところ。どのEventもContextというParameterを持ち、OnSyncに渡したContextをそのまま受け取る。OnSyncErrorのHandlerのみ追加でErrorMessage Parameterを持ち、発生した例外のMessageが入る。

OnSyncStart
OnSync開始時に発生する。
Contextには、「OnSync」のInput Parameterとして渡した値がそのままセットされる(Appのプロパティ設定により自動で発生したOnSyncの場合は空白)。
OnSyncComplete
OnSyncが正常終了すると発生する。
Contextには、「OnSync」のInput Parameterとして渡した値がそのままセットされる(Appのプロパティ設定により自動で発生したOnSyncの場合は空白)。
OnSyncError
ドキュメントによると、
Event triggered if the sync fails.
On Sync内でHandleされないExceptionを発生させると、このEventがTriggerされた。この時OnSyncCompleteはTriggerされなかった。ErrorMessageにはExceptionの同名項目がそのまま設定された。
Contextには、「OnSync」のInput Parameterとして渡した値がそのままセットされる(Appのプロパティ設定により自動で発生したOnSyncの場合は空白)。
別の画面で発生したOnSyncをEventでHandleできるか
画面Aで30秒かかるOnSyncを開始して、終了を待たず、画面Bに遷移する。
画面BはOnSync関係のUI Event (OnSyncCompleteなど) をHandleしている。
動作確認してみると、無事にOnSyncCompleteをHandleでき、Contextも渡ってきた。
同期状態をAppのどのScreenでも確認できるようにするには
以下のようにするといいのではないか。
- Client Variableで同期状態を保持
- 同期開始時にClient Variableを編集(Boolean型ならTrue、あるいはStatic EntityのIdentifierなら「実行中」のIdをセット)
- Blockを作り、Client Variableの値を表示し、さらにOnSyncComplete/Errorで状態を更新
- BlockをLayoutに配置しておく
