SCOとLMS間のデータのやり取りは、「SCORM1.2 ランタイム環境の概要」で説明したように、SCOは、APIアダプタに接続してデータの送受信を行います。SCOは、APIアダプタに対して次のJavaScriptのメソッドを利用することができます。これらのメソッドは、LMSが用意するものです。
APIメソッド
|
意味
|
LMSInitialize() | LMSとの通信セッションを開始する |
LMSFinish() | LMSとの通信セッションを終了する |
LMSGetValue() | LMSから値を取得します |
LMSSetValue() | LMSに値をセットします |
LMSCommit() | すべてのデータを永続化(サーバー側に保存)します |
LMSGetLastError() | 最後のAPIの呼び出しに起因するエラーコードを返します |
LMSGetErrorString() | 指定されたエラーコードの文字列を返します |
LMSGetDiagnostic() | 最後に発生したエラーについての詳細情報を返します |
APIアダプタとSCOとの通信は、3つの状態遷移からなります。
- 未接続
- 接続中
- 切断
それぞれの状態で、利用できるメソッドが異なります。
※ 仕様書では、Not Initialized、Running、Terminatedという風にAPIアダプタの状態遷移が分かれています。
※ findAPI() は、擬似コードです。APIアダプタのメソッドではありません。
未接続 APIアダプタへの接続処理
学習者がSCOを選択しようとしたとき、そのSCOはAPIアダプタに対して、まだ未接続状態です。接続状態になるには、次の2つの処理が必要です。
- APIアダプタのJavaScriptの階層パスを取得する
- LMSInitialize()を実行して接続を確立する
SCOがAPIアダプタに接続しようとするとき、まだLMSInitialize()を実行することはできません。実行するうえで、SCOはLMSのLMSInitialize()メソッドの階層パスが分らないためです。そのため、階層パスを調べ、場所が分った段階で、LMSInitialize()を実行します。そうすることで、「未接続」から「接続中」へと状態を遷移させることができます。
※ SCORMコンテンツを作成するうえで、APIアダプタのパスの取得は、つまづき易いポイントだと思います。
通信セッション中
「接続中」の状態になったら、LMSGetValue()、LMSSetValue()を使いLMSとデータのやり取りができるようになります。どのようなデータを取得、セットするかは、データモデル要素を利用していきます。
とくに、LMSSetValue()は、APIアダプタに対して値をセットするもので、クライアント側の処理となります。必ずしもサーバー側にデータがセットされるとは限りません。そのため、きちんとサーバー側にデータを渡すように、LMSSetValue()を実行した後に、LMSCommit() を実行すると、その時点、クライアント側に溜まっている情報が、サーバ側に渡ります。プッシュする確定ボタンみたいなものです。
通信セッションの終了処理
SCOを終了するときは、LMSFinish()を実行して「切断」します。仕様上では、LMSFinish()を実行すると内部では、LMSCommit()が自動的に実行されます。そのため、むやみに?データをセットしたからといって、LMSCommit()をする必要はそれほどありません。※ただLMSのデフォルトの動作は、LMS依存を引き起こす原因に繋がるため、安心ではありますが。
「切断」状態は、LMSFinish()を実行したときの戻り値により実行できるメソッドです。
エラー情報の取得
LMSGetValue()などを実行したとき、存在しないデータモデル要素や、型が間違っていると、LMSは、エラーコードを戻します。LMSGetLastError()、LMSGetErrorString()、LMSGetDiagnostic()の引数に、そのエラーコードを渡すと、詳細情報など知ることができます。