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

1 ответ

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

Другие вопросы по тегам