PhoneGap: NativeCodeの呼び出し
Rev.1を表示中。最新版はこちら。
PhoneGap(iPhone)を使うと、JavaScriptからGPSなどアプリ用のデバイス機能にもアクセスできるのだが、どのような仕組みになっているのか不思議だったので調査した。
JavaScript -> Native(Objective-C) Codeの呼び出し
GPSの機能などを使う場合、JavaScriptからObjective-Cで書かれたプラグインを呼び出す。
Objective-Cのコードを呼び出すには、PhoneGapLib/javascripts/core/phonegap.js.baseのPhoneGap.exec()を使う。
PhoneGap.exec()はコマンドをキューに入れるだけで、キュー内のコマンドの実行はPhoneGap.run_command()で行う。
PhoneGap.run_command()はダミーのiframeを作成して、
gap://<Class>.<command>/[<arguments>][?<dictionary>]
のような形式のURLを作成してRequestを発行する。
Requestが発行されると、Objective-Cのコードが動き出す。UIWebViewDelegateにwebView:shouldStartLoadWithRequest:navigationType:
というメソッドがあり、これは、webViewがコンテンツの読み込みを開始する前に呼び出される。これを使って、gap://へのアクセスを捕まえている。PhoneGapの場合、PhoneGapLib/Classes/PhoneGapDelegate.mの PhoneGapDelegateクラスのwebView:shouldStartLoadWithRequest:navigationType:メソッドが呼び出される。
webView:shouldStartLoadWithRequest:navigationType:メソッドは、ReuqestのURLがgap://だった場合は、URLで指定されたプラグインのメソッドを呼び出す。
例えば、位置情報を扱うPhoneGap用のJavaScriptコードPhoneGapLib/javascripts/core/geolocation.jsでは、例えば以下のようにしてNativeCodeを呼び出している。
JavaScript: PhoneGap.exec("Location.startLocation", args); // gap://xxxへRequest発行 Objective-C: webView:shouldStartLoadWithRequest:navigationType: // メソッドが呼ばれる gap://xxxxへのアクセスなら、URLからプラグインのメソッドと引数を抽出し呼び出し。 PGLocation.startLocatoin();