从源WKWebView(window.opener)

时间:2017-10-07 02:41:10

标签: javascript ios objective-c wkwebview window.opener

在我的iOS应用程序中,我有2个WKWebView控件来模拟我们的Web应用程序中2个选项卡/窗口的父/子关系,以便我们可以重用所有这些javascripts。问题是这两个WKWebView之间没有通用的通信渠道。

网络架构
- 第一个/主窗口加载我们的内部javascript函数,链接在第二个/子窗口中打开 - 第二个/子窗口加载第三方Web内容 - 第三方内容使用javascript表单源窗口与我们的系统进行通信(使用window.opener / window.parent API桥接器)。

现在,在本机应用中,这就是我正在重复使用现有的javascripts并模拟网络结构 -

一个。 js来自第一个WKWebView -

中的网页
  window.open("http://localhost/child.html", "myWindow", "width=200,height=100");  

湾WKUIDelegate拦截此调用(a)并打开第二个WKWebView -

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {
    // Here, window.open js calls are handled by loading the request in another/new web view
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    WebViewController *webViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"WebViewController"];
    webViewController.loadURLString = navigationAction.request.URL.absoluteString;

    // Show controller without interfering the current flow of API call, thus dispatch after a fraction of second
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [self.navigationController pushViewController:webViewController animated:YES];
    });
    return nil;
}

℃。在Web /计算机浏览器中,Web应用程序的子窗口可以使用window.openerwindow.parent

访问源js函数

如何在WKWebView中实现相同的功能?换句话说,第二个WKWebView中的js函数可以从父/源WKWebView调用js函数吗?

2 个答案:

答案 0 :(得分:1)

您绝对不应该从nil返回webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:,而是WKWebView的实例。

不幸的是,我现在无法对此进行验证。但据我记忆,诀窍也是不要忽略来自WKWebViewConfiguration委托方法的webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:参数,而是创建第二个WKWebView实例,将此参数作为{{1}之一传递参数。

此外,根据Apple文档,如果您要返回正确的Web视图实例,看起来您不需要自己加载请求。 WebKit应该为你处理这个问题。

总体而言,您的代码应类似于:

initWithFrame:configuration:

答案 1 :(得分:0)

完成任务的一种更简单的方法是使用一个WKWebView,并使用HTML来分隔标题和详细信息。最简单的解决方案是使用一个带有标题和所有细节的HTML文档,但如果您需要动态添加细节,也可以使用DOM。使用这种方法,最简单的方法是使用Javascript来处理标题和细节。