2016-11-01 5 views
1

Я использую WKWebview для запуска сценариев javascript.WKWebview javascript работает на симуляторе, но не работает на устройстве, если вид отсутствует на экране

Я не использую JSContext et.al, так как мне нужен контекст javascript, чтобы иметь возможность выполнять запросы XHTTP, которые невозможны только с помощью JSContext.

Этот вид не добавлен в иерархию представления, и я не заинтересован в этом.

WKWebview используется только для его возможности запускать JS-код в своем движке.

Код javascript работает точно так, как ожидалось на симуляторе.

Точный же код будет работать и в контексте некоторых других приложений, с которыми я тестировал.

Но по некоторым причинам в некоторых приложениях WKWebview не будет выполнять javascript, если WKWebview не будет добавлен в иерархию представлений. Следующий код будет работать, как ожидалось. Если вы удаляете #warning-код, перестает работать как ожидалось

-(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

Вы реализовали все методы делегатов для WKWebView?

+0

Методы делегата являются необязательными. Я реализовал only- (void) webView: (WKWebView *) webView didFinishNavigation: (null_unspecified WKNavigation *) навигация –

 Смежные вопросы

  • Нет связанных вопросов^_^