Как передать функцию на веб-страницу с помощью swift? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть ситуация, когда мне нужно захватить событие с помощью нажатия кнопки на веб-странице.

этот код находится на веб-странице одним нажатием кнопки.

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? Любая помощь или узел в правильном направлении было бы здорово.

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

В 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 в качестве конфигурации для вашего веб-просмотра.

0 голосов
/ 18 марта 2019

Вы можете использовать этот WebViewJavascriptBridge для отправки сообщений между Obj-C / Swift и JavaScript.

Кроме того, вы можете сделать это без использования сторонних читателей this .

...