2016-11-01 1 views
1

J'utilise une WKWebview pour exécuter des scripts javascript.WKWebview javascript fonctionne sur le simulateur mais ne fonctionne pas sur l'appareil si la vue n'apparaît pas à l'écran

Je n'utilise pas JSContext et.al car j'ai besoin du contexte javascript pour pouvoir effectuer des requêtes XHTTP qui ne sont pas possibles avec JSContext seul.

Cette vue n'est pas ajoutée à la hiérarchie de vue et je n'ai aucun intérêt à le faire.

La WKWebview est uniquement utilisée pour sa capacité à exécuter du code JS dans son moteur.

Le code javascript fonctionne exactement comme prévu sur le simulateur.

Le même code fonctionnera également dans le contexte de certaines autres applications que j'ai testées.

Mais pour certaines raisons, WKWebview n'exécutera pas le javascript à moins que WKWebview ne soit ajouté à la hiérarchie de vue. Le code suivant fonctionnera comme prévu. Si vous supprimez le code #warning, cesse de fonctionner comme prévu

-(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]; 
} 

Répondre

0

Avez-vous implémenté toutes les méthodes de délégation pour WKWebView?

+0

Les méthodes de délégué sont facultatives. J'ai implémenté seulement - (void) webView: (WKWebView *) webView didFinishNavigation: (null_unspecified WKNavigation *) navigation –