PhoneGapでWindows PhoneのAPIを呼び出す仕組み

前回の記事でPhoneGapはWebBrowserコントロール上で動いていることを説明しました。今回はWebBrowserコントロール上からWindows PhoneのAPIを呼び出す方法を見てみたいと思います。

仕組み(JavaScript --> Silverlight

WebBrowserコントロールにはJavaScriptからSilverlightに文字列を渡す仕組みが存在します。JavaScript側でwindows.external.notify(...)を呼び出すと、Silverlight側でWebBrowserコントロールのScriptNotifyイベントが起こり、そのときにwindows.external.notifyの引数に渡された文字列がScriptNotifyに渡ってきます。

windows.external.notify("文字列") // JavaScript
            ↓
WebBrowser.ScriptNotify(object sender, NotifyEventArgs e) // Silverlight

PhoneGapではこの仕組みを利用し、notifyに渡す引数の文字列にルールを決めることで*1Silverlight側でその文字列を受け取り解析しWindows PhoneのAPIマッピングします。
参考:WebBrowser.ScriptNotify イベント

サンプル

それではカメラを呼び出す(PhotoChooserTask)例を見てみましょう。
ボタンがクリックされたらカメラのAPIを呼び出すことでカメラを表示します。

<button onclick="buttonClick();">ボタン</button>
function buttonClick()
{
    navigator.camera.getPicture(successCallback, failureCallback, { quality: 50 });
}

その他のPhoneGapのAPIの一覧はこちらにあります。API Reference
また各APIWindows Phoneに対応しているかを知るには[Supported Platforms]の項目を見てください。Windows Phoneと書かれていれば利用できます。

Silverlight --> JavaScript

これまではJavaScriptSilverlightの呼び出しですが、それとは逆にSilverlightJavaScriptも呼び出すことができます。それがWebBrowserコントロールのInvoleScriptメソッドです。*2
先ほどのbuttonClick関数を呼び出すには、Silverlight側で次のようにコードを書きます。

  GapBrowser.InvokeScript("buttonClick", new string[]{});


これでJavaScriptSilverlightで相互に連携することができます。

PhoneGapではまだすべてのAPIが実装されているわけではないので必要なAPIが存在しないこともあります。そのようなときでも足りないAPIなどがあればGitHubからソースコードを取得して自分でAPIを追加することも可能です。

*1:PhoneGapでは"/"をデリミタとして、serviceとactionとcallbackIdとargsの4つを渡しています

*2:PhoneGapでは呼び出せません