2016-11-01 3 views
1

私は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]; 
} 

答えて

0

動作を停止しますか

+0

デリゲートメソッドはオプションです。私は実装しました - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)ナビゲーション –

関連する問題