WKWebview 的 javascript 调用返回 nil
Posted
技术标签:
【中文标题】WKWebview 的 javascript 调用返回 nil【英文标题】:WKWebview's javascript call returns nil 【发布时间】:2015-07-08 19:15:25 【问题描述】:我正在尝试从使用 UIWebview 迁移到 WKWebview,我需要调用 webview 中的各种 javascript 函数。
在 UIWebview 中我可以毫无问题地执行此操作,但 WKWebview 会为任何和所有调用抛出 WKErrorDomain Error 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]);
【问题讨论】:
你能分享一下sn-ps代码,让我们看看更多吗? 【参考方案1】:WKWebView 与 UIWebView 不同,执行 JS 异步;你不能像现在这样打印..
试试这个
[self.webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error)
NSLog(@"Error is %@",error);
NSLog(@"JS result %@" ,result);
];
【讨论】:
以上是关于WKWebview 的 javascript 调用返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
在 WKWebView 中的本地网站上调用 javascript Actions
将 iOS 中被调用函数的结果返回给 JavaScript 中 WkWebView 中的调用函数
从使用 wkwebview 返回值的 javascript 调用 swift 函数
从 WKWebView 调用时,无法使用 JavaScript 在移动 Safari 中打开链接