我正在尝试从使用UIWebview迁移到WKWebview,我需要调用webview中存在的各种Javascript函数。
在UIWebview中,我没有遇到任何麻烦,但WKWebview会针对任何和所有调用抛出WKErrorDomain错误4。我认为这可能是一个竞争条件,我在调用DOM中不存在的函数,但是我添加了一个调试语句,一旦页面加载并且它们不起作用就进行相同的调用。我甚至做了一个'document.body.innerHTML',当webview中显示了明显的内容时,它返回了nil。
扭曲的是,当通过Safari Web Inspector检查Web代码时,一切正常并且所有调用都有效。
为什么以及如何?我用WKWebViewConfiguration初始化WKWebView,以便它可以在不同的webview上共享cookie,所以可能会有一些东西,但我很难过。
这是我初始化WKWebView
的方法WKWebViewConfiguration* config = [[WKWebViewConfiguration alloc] init];
config.processPool = [[WKProcessPool alloc] init];
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: @"document.cookie = 'cookie1=value1; domain=blah; path=/;';" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
config.userContentController = userContentController;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectMake(0,0,50,50) configuration:config];
这是一个调试语句,我将文档的innerHTML记录到控制台日志中,该日志打印(nil)而不是HTML。
NSLog(@"%@", [self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:nil]);
答案 0 :(得分:2)
与UIWebView不同,WKWebView执行JS异步;你不能像你一样打印..
试试这个
[self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
NSLog(@"Error is %@",error);
NSLog(@"JS result %@" ,result);
}];