Как передать значение из javascript в iOS UIWebView

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

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

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

<html>
<head>
     <script type = "text/javascript">
            function buttonClickPAss(a,b,c)
            {
              //  console.info(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.info(action);

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

выше мой код js

в собственном быстром я дал этот код после загрузки 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.info(action);

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

и на быстрой стороне я изменил приведенный выше быстрый код на этот

 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 и верну ее как одну строку

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

Благодарность

попробуйте webView.stringByEvaluatingJavaScript (from: "buttonClickPAss ('a', 'b', 'c')")

Sahil Manchanda 01.06.2018 13:45

@SahilManchanda, я пробовал это, но теперь он возвращает только 'a', независимо от того, что когда-либо я передаю его возвращение 'a' :(

milsha 01.06.2018 13:59

@milsha, из кода, который вы поделили для javascript, функция возвращает "a"

Vinaykrishnan 01.06.2018 14:09

@CtrlAltDel нет, он должен возвращать значение 'a', верно?

milsha 01.06.2018 14:15

проверь мой ответ

Sahil Manchanda 01.06.2018 14:15

Надеюсь, это может вам помочь: jayeshkawli.ghost.io/ios-communication-from-javascript-to-sw‌ ift

Vinaykrishnan 01.06.2018 14:21

@CtrlAltDel говорит, как вызвать функцию JS из веб-просмотра, это не то, что я хочу :(

milsha 01.06.2018 14:37

Пробовали ли вы пробовать демо-проект, связанный с ссылкой

Vinaykrishnan 01.06.2018 15:12

@CtrlAltDel да, я работал над этим весь день :(

milsha 01.06.2018 15:41

Хорошо, пойдем поэтапно. Прежде всего, вы проверили, вызывается ли функция, поместив в нее предупреждение.

Vinaykrishnan 01.06.2018 15:52

Вы получили ответ? Я тоже столкнулся с той же проблемой.

Nizzam 06.09.2018 03:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
11
3 653
1

Ответы 1

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).

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

@SahilManchanda Здесь в моем случае мне нужно передать два строковых параметра из JS в swift. Как я могу проверить нажатие этой конкретной кнопки? и как передать несколько параметров?

Ruchira More 19.08.2019 13:11

@RuchiraMore, если посмотреть на быструю сторону, вызывается сообщение didReceive, где message.body является строкой, поэтому вы можете использовать разделитель для передачи нескольких переменных из javascript в виде строки, а затем разделить их, используя тот же разделитель на быстрой стороне.

Sahil Manchanda 20.08.2019 05:08

@SahilManchanda Спасибо, Сахил :) Это все о связи со Swift на Javascript. Как я могу получить данные из JS в swift. пожалуйста, ответьте на мой вопрос здесь stackoverflow.com/questions/57551779/… Существует одно сгенерированное сервером изображение, которое я хочу отображать при просмотре изображений в WKWebview!

Ruchira More 20.08.2019 07:20

@RuchiraMore Я ответил там. но похоже, что этот вопрос не имеет ничего общего с коммуникацией между swift и javascript

Sahil Manchanda 20.08.2019 07:43

Операция использует UIWebView, но ваше решение ссылается на WKWebView. Ваше решение не работает для UIWebView.

Cory McAboy 04.03.2020 15:39

Другие вопросы по теме