자바 스크립트 스크립트를 실행하는 데 WKWebview를 사용하고 있습니다.WKWebview 자바 스크립트가 시뮬레이터에서 작동하지만 화면에 표시되지 않는 경우 장치에서 작동하지 않습니다.
JSContext만으로는 불가능한 XHTTP 요청을 수행하려면 javascript 컨텍스트가 필요하므로 JSContext et.al을 사용하지 않습니다.
이보기는보기 계층 구조에 추가되지 않으므로 관심 없습니다.
WKWebview는 엔진에서 JS 코드를 실행할 수있는 능력을 위해서만 사용됩니다.
자바 스크립트 코드는 시뮬레이터에서 예상대로 작동합니다.
똑같은 코드는 테스트 한 다른 특정 응용 프로그램의 맥락에서도 작동합니다.
그러나 어떤 이유로 WKWebview가 뷰 계층에 추가되지 않는 한 WKWebview는 자바 스크립트를 수행하지 않습니다. 다음 코드는 예상대로 작동합니다. # 경고 코드를 제거하면 예상대로 작동하지 않습니다.
-(void)connect {
//TODO: Handle multiple connect calls
WKUserContentController *userContentController = [WKUserContentController new];
[self addScriptMessageHandlersForSocketEvents:userContentController];
NSString *socketFileContent = [self.class socketIOScript];
WKUserScript *socketIOScript = [[WKUserScript alloc] initWithSource:socketFileContent
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:NO];
[userContentController addUserScript:socketIOScript];
NSString *bridgeJs = [self.class bridgeScript];
WKUserScript *bridgeScript = [[WKUserScript alloc] initWithSource:bridgeJs
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:NO];
[userContentController addUserScript:bridgeScript];
NSMutableDictionary *d = [NSMutableDictionary new];
for (NSURLQueryItem *item in _parameters) {
d[item.name] = item.value;
}
NSString *params = json(d);
NSString *socketURLScript = [NSString stringWithFormat:@"createSocket(%@,%@);log('created script')",stringify(_url),params];
WKUserScript *createSocket = [[WKUserScript alloc] initWithSource:socketURLScript
injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
forMainFrameOnly:NO];
[userContentController addUserScript:createSocket];
WKWebViewConfiguration * wkconfiguration = [WKWebViewConfiguration new];
wkconfiguration.userContentController = userContentController;
_wv = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 0, 0) configuration:wkconfiguration];
#warning REMOVE THIS AND THE WKWebview stops working on some devices (NOT ALL DEVICES) and works in some applications as expected
[[UIApplication sharedApplication].keyWindow addSubview:_wv];
// END REMOVE THIS
_wv.navigationDelegate = self;
dispatch_group_enter(_loadedSemaphore);
[_wv loadHTMLString:@"<h1></h1>" baseURL:nil];
}
대리자 메서드는 선택 사항입니다. 내가 구현 한 - (void) webView : (WKWebView *) webView didFinishNavigation : (null_unspecified WKNavigation *) 네비게이션 –