Мне нужно передать переменную 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
но когда я искал то же самое в 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 и верну ее как одну строку
Пожалуйста помоги
Благодарность
@SahilManchanda, я пробовал это, но теперь он возвращает только 'a', независимо от того, что когда-либо я передаю его возвращение 'a' :(
@milsha, из кода, который вы поделили для javascript, функция возвращает "a"
@CtrlAltDel нет, он должен возвращать значение 'a', верно?
проверь мой ответ
Надеюсь, это может вам помочь: jayeshkawli.ghost.io/ios-communication-from-javascript-to-sw ift
@CtrlAltDel говорит, как вызвать функцию JS из веб-просмотра, это не то, что я хочу :(
Пробовали ли вы пробовать демо-проект, связанный с ссылкой
@CtrlAltDel да, я работал над этим весь день :(
Хорошо, пойдем поэтапно. Прежде всего, вы проверили, вызывается ли функция, поместив в нее предупреждение.
Вы получили ответ? Я тоже столкнулся с той же проблемой.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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. Как я могу проверить нажатие этой конкретной кнопки? и как передать несколько параметров?
@RuchiraMore, если посмотреть на быструю сторону, вызывается сообщение didReceive, где message.body является строкой, поэтому вы можете использовать разделитель для передачи нескольких переменных из javascript в виде строки, а затем разделить их, используя тот же разделитель на быстрой стороне.
@SahilManchanda Спасибо, Сахил :) Это все о связи со Swift на Javascript. Как я могу получить данные из JS в swift. пожалуйста, ответьте на мой вопрос здесь stackoverflow.com/questions/57551779/… Существует одно сгенерированное сервером изображение, которое я хочу отображать при просмотре изображений в WKWebview!
@RuchiraMore Я ответил там. но похоже, что этот вопрос не имеет ничего общего с коммуникацией между swift и javascript
Операция использует UIWebView, но ваше решение ссылается на WKWebView. Ваше решение не работает для UIWebView.
попробуйте webView.stringByEvaluatingJavaScript (from: "buttonClickPAss ('a', 'b', 'c')")