2016-11-05 1 views
0

iOS Objective-C JavaScriptCore JSContext에서 proj4.js (projections Javascript, http://proj4js.org)를 실행할 수 없었습니다. 컨텍스트에서 실행하려고하면 proj4 함수는 동일한 JSContext에서 실행하려고하는 후속 Javascript 코드에서 사용할 수 없습니다. proj4.js 실행하려고 할 때JavaScriptCore JSContext에서 proj4.js를 실행할 수 없습니다.

JSContext에 자바 스크립트 예외 처리를 활성화 한 후, 나는 다음과 같은 예외를 얻을 것을 발견 :

TypeError: undefined is not an object (evaluating 'b.proj4=a()')

을 나는이 성공적으로 몇 가지를 통해 WKWebView에서 같은 proj4.js을 실행 스크립트를로드하는 HTML입니다. 잘 작동합니다. 하지만 이제는 JSContext에서 실행해야합니다. JSContext에서 객체를 사용하고 Javascript 출력을 Objective-C 객체로 변환해야합니다.

NSString *proj4Path = [[NSBundle mainBundle] pathForResource:@"proj4" ofType:@"js" inDirectory:@"proj4"]; 
    NSString *proj4JS = [NSString stringWithContentsOfFile:proj4Path usedEncoding:nil error:nil]; 
    JSContext *context = [[JSContext alloc] init]; 
    context.exceptionHandler = ^(JSContext *context, JSValue *exception) { 
     NSLog(@"JAVASCTIPT EXCEPTION: %@", exception); 
    }; 
    [context evaluateScript:proj4JS]; // FAILS HERE 

을 나는 매우 간단한 자바 스크립트와 마지막 줄은 잘 작동 것으로 교체하는 경우 :

다음은 실패 코드입니다. 예 :

[context evaluateScript:@"1 + 1"]; 

따라서 문맥 자체가 작동하는 것으로 보입니다. 아마도 환경이나 JSContext의 설정에 문제가있을 수 있지만, 나는 아무것도 생각할 수 없다.

편집 : 예외가 발생 proj4.js의 행은 다음과 같습니다

"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.proj4=a() 

그래서이 둘 다 '창'도 '글로벌'이나 '자기하는 것은'를 JSContext 환경에서 정의되지 않은 것을 나타냅니다 (I 생각한다?). 저는 JavaScriptCore에 익숙하지 않습니다. (자바 스크립트도 적당하지 않습니다.) 그래서 여기에서 어디로 가야할지 모르겠습니다. (하지만 계속 연구 할 것입니다.)

답변

0

내 질문에 대한 편집에 따라 'window'도 아니고 'global'도 'self'도 새 JSContext에 정의 된 것처럼 보이지 않습니다. 이것은 '창'('글로벌'또는 '자체'에 대해서는 확실하지 않음 !!!)에 대해 의미가 있습니다.

는 그래서 생각 해낸 두 가지 수정 사항이 있습니다 :

  1. 이 첫 번째 수정 proj4.js을 위해 작동하지만, 내가 실행하는 데 필요한 두 개의 연속 자바 스크립트가 작동하지 않습니다. 이 수정 프로그램은 단순히 proj4.js 실행하기 전에 목표 - C 코드의 다음 줄을 추가했다 :

    [context evaluateScript:@"var global = this;"]; 
    

을 다음 문제 선 (원래의 질문에 내 원래 코드의 마지막 줄) 잘 달린다!

  1. 이 수정 프로그램은 일반적인 웹 브라우저에서 동작 할 수있는 모든 JavaScript에서 작동한다는 점에서 더 포괄적입니다. 그러나, 그것은 더 강압적이다. 이 솔루션에 필요한 단 하나의 변화가있는 UIWebView에서 JSContext를 얻을 수있는 JSContext '초기화'라인을 교체하는 것입니다 : 나는 웹보기의 인스턴스를 피하기 위해 원합니다 있지만

    JSContext * context = [[[UIWebView alloc] init] valueForKeyPath : @"documentView.webView.mainFrame.javaScriptContext" ]; 
    

을, 너무있다 많은 누락 된 구성 요소가 복잡한 Javascript에 대해 원시 JSContext를 사용합니다. 또한 UIWebView보다는 WKWebView를 사용하는 것을 선호하지만, 현재 WKWebView의 JSContext를 사용할 수 없습니다.