如何使用swift将功能传递给网页?

Posted

技术标签:

【中文标题】如何使用swift将功能传递给网页?【英文标题】:How to pass function to webpage using 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/… 它的有效问题......为什么它被否决了? 【参考方案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 的情况下做到这一点。

【讨论】:

以上是关于如何使用swift将功能传递给网页?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 将 Float 制服传递给 iOS 金属着色器?

如何使用 swift 2.2 从“performSegueWithIdentifier”按钮将视频字段传递给 AVPlayer 控制器

如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]

Swift - 如何将视图控制器的引用传递给子 UIView 类?

Swift:如何将从委托接收到的值传递给函数的完成块?

如何将元数据谷歌语音传递给文本 api - swift ios