【问题标题】:How to pass function to webpage using swift?如何使用swift将功能传递给网页?
【发布时间】:2019-03-18 05:24:33
【问题描述】:

我有一种情况,我需要通过网页中的按钮单击来捕获事件。

此代码在网页上单击按钮。

okCoolClick = () => {
/*eslint-disable* /
console.log("okay cool ", window.okCool);
if (window.okCool) {
  okCool.performClick();
} else {
  window.open("some-url");
}
};

现在 Android 团队已经解决了这个问题,代码如下。

commonWebView.addJavascriptInterface(object : Any() {
           @JavascriptInterface
           fun performClick() {
               val ownerId = arguments?.getInt(OWNER_ID)
               if (ownerId == -1) {
                   context?.startActivity<RightNavigationActivity>()
                   activity?.finishAffinity()
               } else {
                   context?.startActivity<HomeItemListActivity>(
                           Pair(HomeItemListActivity.INTENT_EXTRA_COMPONENT,
                                   AppConstants.HOME_SUB_LIST_CLUB_OUTLET_LIST),
                           Pair(HomeItemListActivity.INTENT_EXTRA_CLUB_ID, ownerId),
                           Pair(HomeItemListActivity.INDUSTRY_ID, -1)
                   )
                   activity?.finish()
               }
           }
       }, "okCool")

所以,现在我只能在 iOS 中寻找解决方案了,

如何在我的 iOS 项目中实现这一点?任何朝着正确方向的帮助或节点都会很棒。

【问题讨论】:

  • 你可以研究一些 webkit+javascript 的例子。 robkerr.com/…
  • 它的有效问题......为什么它被否决了?

标签: ios swift uiwebview wkwebview


【解决方案1】:

在 ViewDidLoad() 中添加这个

let config = WKWebViewConfiguration()
let contentController = WKUserContentController()
contentController.add(self, name: "function")
config.userContentController = contentController
webView = WKWebView(frame: .zero, configuration: config)

从 WKNavigationDelegate 委托中添加两个方法:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    return decisionHandler(.allow)
}

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
{
    if navigationAction.navigationType == WKNavigationType.linkActivated, let url = navigationAction.request.url{
        DeepLink.deepLink(url.absoluteString)
    }
    return decisionHandler(.allow)
}

最后添加最重要的方法来从 WKScriptMessageHandler 委托中获取回调:

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage){
    let dataFromWeb = message.body //Data Passed from webview
}

像这样从 html 传递数据

var myObj = {"name":"John", "age":30, "car":null};
window.webkit.messageHandlers.function.postMessage(myObj);

“函数”名称应该与上述语句中的名称相同,并且当您将 userContentController 添加为 webview 的配置时。

【讨论】:

    【解决方案2】:

    您可以使用此WebViewJavascriptBridge 在 Obj-C/Swift 和 JavaScript 之间发送消息。

    您也可以在不使用任何第三方读取this 的情况下做到这一点。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多