Как передать значение из JavaScript в iOS UIWebView - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно передать переменную javascript в iOS UIWebView, я очень легко сделал то же самое с Android, но здесь не смог.

Что мне нужно, так это то, что я нажму на ссылку в веб-представлении, и эта ссылка, в свою очередь, вызовет эту функцию JS buttonClickPAss с некоторыми параметрами, и я хочу, чтобы все параметры, которые я передал на веб-сайте нативномубыстрый код.Не только для вызова этой функции JS и возврата ее значения в swift.

Я добавлю весь HTML-код ниже

<html>
<head>
     <script type="text/javascript">
            function buttonClickPAss(a,b,c)
            {
              //  console.log(action);

                return a;// return what i passed to the function that is valueA
            }
            </script>
</head>
<body>
    <b><a  href='#' onclick="buttonClickPAss('valueA','valueB','valueC');"> Click here from webview</a></b>
</body>
</html>

, это 'valueA', 'valueB' и 'valueC'Заполняется при загрузке html-страницы. Мне нужны эти значения в моем быстром коде

. Затем я загружу вышеупомянутую html-страницу в веб-просмотр и щелкну по ссылке из веб-просмотра, чтобы вызвать функцию JS, потому что мои значениязаполняются на веб-странице.

это учебник, который я пробовал в Android

https://capdroidandroid.wordpress.com/2015/07/03/how-send-data-from-javascript-to-native-android-app/

, но когда я искал то же самое в ios, я нашел этот учебник

<script type="text/javascript">
            function buttonClickPAss()
            {
              //  console.log(action);

                return 'hi from js';
            }
            </script>

выше мой код js

в native swift Я дал этот код после загрузки URL

 func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

        let url = request.url!
        let result =  webView.stringByEvaluatingJavaScript(from: "buttonClickPAss()")
        print("Result = ",result!)

return true
}

вышеупомянутый код работает нормально, когда я нажал нассылка, которая вызывает эту функцию js, я получил журнал в моем xcode как 'привет от js'

, но мне нужно передать значение в функцию buttonClickPAss, поэтому я изменил вышеуказанные коды на этот

в JS

<script type="text/javascript">
            function buttonClickPAss(a,b,c)
            {
              //  console.log(action);

                return a;// return what i passed to the function
            }
            </script>

и в быстрой стороне icповесил приведенный выше код swift на этот

 func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

        let url = request.url!
        let result =  webView.stringByEvaluatingJavaScript(from: "buttonClickPAss(a,b,c)")
        print("Result = ",result!)

return true
}

, но здесь "Результат" ничего не печатает,

Я искал другие учебники, также везде, где они имеют дело с функциями с пустыми параметрами, может кто-нибудьПомогите мне, пожалуйста,

Еще одна заметка, согласно вышеприведенному руководству по Android, я мог бы передавать переменные js отдельно в три переменные в Android, существует ли подобный механизм в ios swift?в худшем случае я сделаю строку json и верну ее в виде одной строки

Пожалуйста, помогите

спасибо

1 Ответ

0 голосов
/ 01 июня 2018
import UIKit
import WebKit
class ViewController: UIViewController {
    @IBOutlet weak var webView: WKWebView!
    var activityIndicator: UIActivityIndicatorView?
    func setupWebView(){
        webView.navigationDelegate = self
        activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray)
        activityIndicator?.center = self.view.center
        self.view.addSubview(activityIndicator!)
        webView.load(URLRequest(url: URL(string: "YourWebSiteLinkHere")!))
        webView.configuration.userContentController.add(self, name: "myInterface")
        webView.evaluateJavaScript(s, completionHandler: {(string,error) in
            print(error ?? "no error")
        })
        activityIndicator?.startAnimating()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
         setupWebView()
    }
}
extension ViewController: WKScriptMessageHandler{
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
         print("Message received: \(message.name) with body: \(message.body)")
    }
}
extension ViewController: WKNavigationDelegate{
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        self.activityIndicator?.stopAnimating()
        self.activityIndicator?.removeFromSuperview()
        self.activityIndicator = nil
    }
}

В html-коде

<script type="text/javascript">
   function buttonClickPAss(a,b,c){
      //The following line will pass the a to swift 
      window.webkit.messageHandlers.myInterface.postMessage(a)
   }
</script>

В указанном выше коде я зарегистрировал "myInterface".Так что, когда бы вы ни захотели предоставить данные из JavaScript в Swift, вы можете легко это сделать.Теперь в вашем примере, когда пользователь нажимает на ссылку кнопку;buttonClickPAss будет вызываться.теперь в вашем методе buttonClickPAss строка window.webkit.messageHandlers.myInterface.postMessage(a) будет передавать переменные данные в Swift в методе func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage).

Я думаю, этого должно быть достаточно для решения вашей проблемы.Для получения дополнительной информации посетите этот SO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...