javascript - WKWebview javascript 可在模拟器上运行,但如果 View 不在屏幕上,则无法在设备上运行

标签 javascript ios webkit wkwebview wkwebviewconfiguration

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

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

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

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

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

完全相同的代码也适用于我测试过的某些其他应用程序的上下文。

但由于某些原因,在某些应用程序中,除非将 WKWebview 添加到 View 层次结构中,否则 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];
}

最佳答案

您是否实现了 WKWebView 的所有委托(delegate)方法?

关于javascript - WKWebview javascript 可在模拟器上运行,但如果 View 不在屏幕上,则无法在设备上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40361681/

相关文章:

ios - 查看旧导航栏和选项卡栏 Controller 的 Controller 问题

node.js - Node webkit 的替代品? (重要的文件大小)

iphone - iOS 7 UIButton 的 Voiceover 问题

objective-c - iPhone OpenGL-ES 视频纹理

javascript - 快速 GET 路线不起作用

javascript - 'document.getElementById(...)' 为 null 或不是 IE8 中的对象

javascript - 有没有办法使用 Web Audio API 比实时更快地采样音频?

ios - 第三方 cookie 在 iOS WKWebview 的 iFrame 中被阻止

php - JavaScript奇怪的错误:“意外的')'”

javascript - 检查所有输入字段是否已使用 jQuery 填写