私はWKWebviewを使用してjavascriptスクリプトを実行しています。WKWebview javascriptはシミュレータで動作しますが、ビューが画面に表示されていないとデバイス上で動作しません。
私は、JSContextだけでは不可能なXHTTPリクエストを実行できるように、javascriptコンテキストが必要なので、JSContext et.alを使用していません。
このビューはビュー階層に追加されていません。このビューは表示階層に追加されません。
WKWebviewは、エンジンでJSコードを実行するためにのみ使用されます。
javascriptコードは、シミュレータで期待どおりに動作しています。
まったく同じコードは、私がテストした特定の他のアプリケーションのコンテキストでも機能します。
しかし、特定のアプリケーションでは、WKWebviewがビュー階層に追加されていない限り、WKWebviewはJavaScriptを実行しません。次のコードは期待どおりに動作します。 #warningコードを削除する場合は、予想通り、あなたが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 *)ナビゲーション –