JSContext 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
JavaScript 엔진을 캡슐화합니다.
[Foundation.Register("JSContext", true)]
public class JSContext : Foundation.NSObject
[<Foundation.Register("JSContext", true)>]
type JSContext = class
inherit NSObject
- 상속
- 특성
설명
네 JSContext 임스페이스의 중앙 개체입니다 JavaScriptCore . JavaScript JSContext 환경(속성에 의해 Item[NSObject] 조작됨)을 유지하고 메서드를 사용하여 스크립트를 EvaluateScript(String, NSUrl) 평가합니다.
애플리케이션 개발자는 종종 javaScript 영역에서 발생한 예외의 Xamarin.iOS 코드에서 액세스 권한을 얻기 위해 ExceptionHandler 속성에 대리자를 할당하려고 합니다.
다음 예제에서는 기본 사용 .JSContext 컨텍스트가 인스턴스화되고 간단한 예외 처리기가 할당됩니다. 메서드 오버로드 중 From(NSObject, JSContext) 하나는 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및 특성이 있는 ProtocolAttributeExportAttribute 메서드MyFunc입니다.: - 인터페이스를 구현합니다.
JavaScript에 IMyJSVisibleProtocol 노출하기 위해 개발자는 다음 메서드에서 ViewDidLoad() 다음과 같은 코드를 사용할 수 있습니다 UIViewController.
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 최종 사용자에게 표시할 개체를 만듭니다.
- JSContext 개체의 주 프레임을 UIWebView 가져옵니다.
- JavaScript 문제가 Xamarin 프로젝트에 표시되도록 예외 처리기를 추가합니다. :
-
위에서 설명한 대로 ;를 구현하는 새
MyJSExporter개체를IMyJSVisibleProtocol인스턴스화합니다. -
이름을
myCSharpObject가진 개체에 JSContext 해당 개체를 추가합니다. - HTML 파일을 로드합니다(아래 참조).
마지막으로 개체가 배치된 상태로 로드된 UIWebViewJSContextMyJSExporter 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에서 이 작업은 빌드 옵션/iOS 빌드 창의 Project 옵션 대화 상자에서 수행됩니다.

Xamarin.iOS에서 C# 코드를 호출하는 또 다른 방법은 다음과 같이 REST를 사용하는 것입니다.
JavaScript 코드에서 표준 JSON 기술을 사용하여 XMLHttpRequest 로컬 디바이스에서 실행되는 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();
}
마지막으로, 세 번째 방법은 JavaScript 계산으로 JSContext 설정된 플래그를 폴링하는 것입니다.
생성자
| Name | Description |
|---|---|
| JSContext() |
JavaScript 엔진을 캡슐화합니다. |
| JSContext(JSVirtualMachine) |
JavaScript 엔진을 캡슐화합니다. |
| JSContext(NativeHandle) |
관리되지 않는 개체의 관리되는 표현을 만들 때 사용되는 생성자입니다. 런타임에서 호출합니다. |
| JSContext(NSObjectFlag) |
초기화를 건너뛰고 개체를 할당하기 위해 파생 클래스를 호출하는 생성자입니다. |
속성
| Name | Description |
|---|---|
| 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) |