当html中显示特定屏幕时,从WKWebView获取通知到Swift

时间:2018-03-13 07:16:51

标签: javascript html ios swift wkwebview

我有sample html

我正在使用# kubectl -n kube-system logs kube-proxy-n5lxp I0312 16:39:01.667127 1 feature_gate.go:190] feature gates: map[] error: unable to read certificate-authority /var/run/secrets/kubernetes.io/serviceaccount/ca.crt for default due to open /var/run/secrets/kubernetes.io/serviceaccount/ca.crt: no such file or directory 来显示此HTML。我想要的是当用户完成游戏时,即当"高分"屏幕出现,我们也在我们的代码中得到通知(即swift),因此我们忽略该视图并获得最高分。

可能的方法是什么?

我做了以下但是没有给出任何功能

WKWebView

2 个答案:

答案 0 :(得分:0)

您没有完全设置通信。 swift设置看起来很好,但是没有调用你的监听器函数,因为你没有发送任何消息。要从Web视图接收消息,您需要将消息发布到该特定消息处理程序。因此,如果您注册一个名为onVisibilityChanged的消息处理程序,则需要从您的javascript向该处理程序发送消息。

在你的内部javascript eventListener执行此操作:

function onVisibilityChanged() {
    if (document.hidden || document.mozHidden || document.webkitHidden || document.msHidden) {
        cr_setSuspended(true);
    } else {
        cr_setSuspended(false);
    }

    var message = {
        "whatever": "you want to send"
    }

    window.webkit.messageHandlers.onVisibilityChanged.postMessage(message);
};

然后阅读你的信息:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    guard let body = message.body as? [String:Any] else {
        return
    }

    print("message from the other side >> \(body["whatever"])")
}

答案 1 :(得分:-1)

您可以使用window.location = "<your protocol name>:<some payload>";

它将解雇 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler委托方法,您可以使用取消处理检查协议名称以防止加载页面:

if ([navigationAction.request.URL.absoluteString.stringByRemovingPercentEncoding hasPrefix:@"<your protocol name>"]) {
    decisionHandler(WKNavigationActionPolicyCancel);
}

此示例适用于我的项目中的Objective-C。 Swift的实现也有类似的行为。