JSContext クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
JavaScript エンジンをカプセル化します。
[Foundation.Register("JSContext", true)]
public class JSContext : Foundation.NSObject
[<Foundation.Register("JSContext", true)>]
type JSContext = class
inherit NSObject
- 継承
- 属性
注釈
JSContextは、JavaScriptCore名前空間の中心オブジェクトです。
JSContextは JavaScript 環境 (Item[NSObject] プロパティによって操作) を維持し、EvaluateScript(String, NSUrl) メソッドを使用してスクリプトを評価します。
アプリケーション開発者は、多くの場合、javaScript 領域で発生した例外の Xamarin.iOS コードでアクセスできるように、ExceptionHandler プロパティにデリゲートを割り当てる必要があります。
次の例は、 JSContextの基本的な使用方法を示しています。 コンテキストがインスタンス化され、単純な例外ハンドラーが割り当てられます。
From(NSObject, JSContext)メソッドのオーバーロードの 1 つは、JavaScript 変数arg1とarg2に値を割り当てるために使用されます。
EvaluateScript(String, NSUrl) メソッドは JavaScript を評価し、結果を返します。結果は、ToInt32() メソッドを使用して.NET オブジェクトに変換されます。
jsContext = new JSContext();
jsContext.ExceptionHandler = (context, exception) => {
Console.WriteLine(exception);
};
jsContext[new NSString("arg1")] = JSValue.From(2, jsContext);
jsContext[new NSString("arg2")] = JSValue.From(2, jsContext);
var jsResult = jsContext.EvaluateScript("arg1 + arg2;");
var four = jsResult.ToInt32();
JSContextには、次の例に示すように、JavaScript 計算によって設定された変数を含むグローバル JavaScript コンテキストが含まれています。
jsContext.EvaluateScript("sum = 2 + 2;");
var four = jsContext[(NSString)"sum"].ToInt32();
JavaScript からの C# コードの呼び出し
開発者は、 IJSExport インターフェイスを拡張して、JavaScript から呼び出すことができるメソッドを定義できます。 開発者は、そのインターフェイスを ProtocolAttribute 属性でマークし、JavaScript 呼び出し可能メソッドを ExportAttribute 属性でマークする必要があります。 また、プロジェクト ファイル内の MSBuild プロパティ Registrar を "static" または "managed-static" に設定する必要があります。 例えば次が挙げられます。
[Protocol ()]
interface IMyJSVisibleProtocol : IJSExport {
[Export ("myFunc")]
int MyFunc ();
[Export ("Arity2:With:")]
NSObject Arity2With(NSObject arg1, NSObject arg2);
}
class MyJSExporter : NSObject, IMyJSVisibleProtocol
{
public int MyFunc ()
{
Console.WriteLine ("Called!");
return 42;
}
public NSObject Arity2With(NSObject arg1, NSObject arg2)
{
Console.WriteLine ("Arity 2 function called with " + arg1 + " " + arg2);
return (NSNumber) 42;
}
}
上記の例:
-
IMyJSVisibleProtocolを拡張IJSExportとして定義します。: -
IMyJSVisibleProtocolを装飾し、ProtocolAttribute属性とExportAttribute属性でMyFuncメソッドです。 - インターフェイスを実装します。
IMyJSVisibleProtocolを JavaScript に公開するために、開発者は、UIViewControllerの ViewDidLoad() メソッドで次のようなコードを使用できます。
webView = new UIWebView(UIScreen.MainScreen.Bounds);
var context = (JSContext) webView.ValueForKeyPath ((NSString) "documentView.webView.mainFrame.javaScriptContext");
context.ExceptionHandler = (JSContext context2, JSValue exception) =>
{
Console.WriteLine ("JS exception: {0}", exception);
};
var myExporter = new MyJSExporter ();
context [(NSString) "myCSharpObject"] = JSValue.From (myExporter, context);
webView.LoadRequest(NSUrlRequest.FromUrl(new NSUrl("MyHtmlFile.html", false)));
上記の C# コード:
- エンド ユーザーに表示される UIWebView を作成します。
- UIWebView オブジェクトのメイン フレームのJSContextを取得します。:
- JavaScript の問題がXamarin プロジェクトに表示されるように例外ハンドラーを追加します。:
-
前述のように、
IMyJSVisibleProtocolを実装する新しいMyJSExporterオブジェクトをインスタンス化します。 -
myCSharpObjectという名前のオブジェクトをJSContextに追加します。 - HTML ファイルを読み込みます (下記参照)。
最後に、UIWebViewに読み込まれ、MyJSExporter オブジェクトが配置されたJSContextに読み込まれる HTML ファイルは、JavaScript 内からオブジェクトにアクセスできます。
<html>
<head>
<title></title>
<script type="text/javascript">
function callXamObject() {
// `myCSharpObject` injected into JS context by C# code `context [(NSString) "myCSharpObject"] = JSValue.From (...etc...`
var resultCalculatedInCSharp = myCSharpObject.myFunc();
document.getElementById("Output").innerHTML = resultCalculatedInCSharp;
}
function callArity2Method() {
//Note how this is mapped by [Export ("Arity2:With:")]
var result = myCSharpObject.Arity2With("foo", "bar");
}
</script>
</head>
<body>
<div onclick="callXamObject()" class="button">
Click Me
</div>
<div id="Output">Value</div>
</body>
</html>
JavaScript に表示されるように C# オブジェクトをエクスポートするには、開発者は mtouch で使用される引数に --registrar:static 引数を追加する必要があります。 Xamarin Studio の [Project オプション] ダイアログの [ビルド オプション] / [iOS ビルド] ウィンドウで、次の操作を行います。

Xamarin.iOS から C# コードを呼び出すもう 1 つの手法は、次に示すように REST を使用することです。
JavaScript コードでは、 XMLHttpRequest と標準の JSON 手法を使用して、ローカル デバイスで実行されている REST サービスにクエリを投稿して解析します。
<html>
<head>
<title></title>
<script type="text/javascript">
function callCSharp(msg) {
var request = new XMLHttpRequest();
request.open('GET','http://127.0.0.1:1711/', false);
request.send();
if(request.status == 200){
alert(JSON.parse(request.responseText));
}else{
alert("Error");
}
}
</script>
</head>
<body>
<div onclick="callCSharp('this is a test')" class="button">
Click Me
</div>
</body>
</html>
アプリケーションで、 HttpListener を使用して、その要求をリッスンして応答します。
//Wire up listener
listener = new HttpListener();
listener.Prefixes.Add("http://*:1711/");
listener.Start();
listener.BeginGetContext(new AsyncCallback(Callback), listener);
//....etc...
void Callback(IAsyncResult result)
{
//Get the listener context
var context = listener.EndGetContext(result);
//Start listening for the next request
listener.BeginGetContext(new AsyncCallback(Callback), listener);
var response = CalculateResponse();
var responseBytes = System.Text.Encoding.UTF8.GetBytes(response);
context.Response.ContentType = "text/json";
context.Response.StatusCode = HttpStatusCode.OK;
context.Response.ContentLength64 = responseBytes.Length;
context.Response.OutputStream.Write(responseBytes, 0, responseBytes.Length);
context.Response.OutputStream.Close();
}
最後に、3 つ目の手法は、JavaScript 計算によって設定されたフラグの JSContext をポーリングすることです。
コンストラクター
| 名前 | 説明 |
|---|---|
| JSContext() |
JavaScript エンジンをカプセル化します。 |
| JSContext(JSVirtualMachine) |
JavaScript エンジンをカプセル化します。 |
| JSContext(NativeHandle) |
アンマネージ オブジェクトのマネージド表現を作成するときに使用されるコンストラクター。 ランタイムによって呼び出されます。 |
| JSContext(NSObjectFlag) |
初期化をスキップし、単にオブジェクトを割り当てるために派生クラスを呼び出すコンストラクター。 |
プロパティ
| 名前 | 説明 |
|---|---|
| AccessibilityAttributedUserInputLabels |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| AccessibilityRespondsToUserInteraction |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| AccessibilityTextualContext |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| AccessibilityUserInputLabels |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Class |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| ClassHandle |
このクラスの Objective-C クラス ハンドル。 |
| CurrentArguments |
JavaScript エンジンをカプセル化します。 |
| CurrentCallee |
JavaScript エンジンをカプセル化します。 |
| CurrentContext |
JavaScript エンジンをカプセル化します。 |
| CurrentThis |
JavaScript エンジンをカプセル化します。 |
| DebugDescription |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Description |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Exception |
JavaScript エンジンをカプセル化します。 |
| ExceptionHandler |
JavaScript エンジンをカプセル化します。 |
| ExposedBindings |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| GlobalObject |
JavaScript エンジンをカプセル化します。 |
| Handle |
アンマネージ オブジェクト表現へのハンドル (ポインター)。 (継承元 NSObject) |
| Inspectable |
JavaScript エンジンをカプセル化します。 |
| IsDirectBinding |
このインスタンスが直接 Objective-C バインドを使用するかどうかを示す値を取得または設定します。 (継承元 NSObject) |
| IsProxy |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Item[NSObject] |
JavaScript エンジンをカプセル化します。 |
| JSGlobalContextRefPtr |
JavaScript エンジンをカプセル化します。 |
| Name |
JavaScript エンジンをカプセル化します。 |
| RetainCount |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Self |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| Superclass |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |
| SuperHandle |
この NSObjectの基底クラスのメソッドを表すために使用されるハンドル。 (継承元 NSObject) |
| VirtualMachine |
JavaScript エンジンをカプセル化します。 |
| Zone |
JavaScript エンジンをカプセル化します。 (継承元 NSObject) |