【问题标题】:WKWebview javascript works on simulator but doesn't work on device if the view isn't on the screenWKWebview javascript 适用于模拟器,但如果视图不在屏幕上,则不适用于设备
【发布时间】:2017-03-14 16:29:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: javascript ios webkit wkwebview wkwebviewconfiguration


    【解决方案1】:

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

    【讨论】:

    • 委托方法是可选的。我只实现了- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2011-03-08
    • 2015-02-13
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多