3

我正在使用 WKWebview 来运行 javascript 脚本。

我没有使用 JSContext et.al,因为我需要 javascript 上下文才能执行单独使用 JSContext 无法执行的 XHTTP 请求。

此视图未添加到视图层次结构中,我没有兴趣这样做。

WKWebview 仅用于在其引擎中运行 JS 代码的能力。

javascript 代码在模拟器上完全按照预期工作。

完全相同的代码也可以在我测试过的某些其他应用程序的上下文中工作。

但是由于某些原因,在某些应用程序中,除非将 WKWebview 添加到视图层次结构中,否则 WKWebview 不会执行 javascript。以下代码将按预期工作。如果删除 #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];
}
4

1 回答 1

0

您是否为 WKWebView 实现了所有委托方法?

于 2016-11-01T14:07:05.937 回答