如何将值从 javascript 传递到 iOS UIWebView

Posted

技术标签:

【中文标题】如何将值从 javascript 传递到 iOS UIWebView【英文标题】:How to pass value from javascript to iOS UIWebView 【发布时间】:2018-06-01 11:39:25 【问题描述】:

我需要将 javascript 变量传递给 ios UIWebView,我在 android 上也很容易做到这一点,但在这里做不到。

我需要的是我将单击 webview 中的一个链接,该链接将反过来调用这个 JS 函数 buttonClickPAss 并带有一些参数,我想要我在 web 端传递给本机 swift 代码的所有参数。不仅仅是调用那个 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>

在加载 html 页面时会填充这个 'valueA'、'valueB' 和 'valueC' 我需要在我的 swift 代码中使用这些值

然后,我将在 webview 中加载上述 html 页面,然后单击 webview 中的链接,以便调用 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代码

在本地 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中的日志是'hi from 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>

在 swift 方面,我将上面的 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 字符串并将它作为单个字符串返回

请帮忙

谢谢

【问题讨论】:

试试 webView.stringByEvaluatingJavaScript(from: "buttonClickPAss('a','b','c')") @SahilManchanda 我试过了,但现在它只返回 'a',不管我通过它返回的'a' :( @milsha,从您为 javascript 共享的代码中,该函数返回“a” @CtrlAltDel 不,它应该返回'a'的值对吗? 检查我的答案 【参考方案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 提供数据,你都可以轻松地做到这一点。 现在在您的示例中,当用户单击链接按钮时; buttonClickPAs 将被调用。现在在您的 buttonClickPAss 方法中,window.webkit.messageHandlers.myInterface.postMessage(a) 行将在 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) 方法中将变量数据传递给 Swift。

我认为这应该足以解决您的问题。欲了解更多信息,请访问SO

【讨论】:

@SahilManchanda 在我的例子中,我必须将两个字符串参数从 JS 传递给 swift。我如何检查被点击的特定按钮?以及如何传递多个参数? @RuchiraMore 如果查看 swift 端 didReceive 消息被调用,其中 message.body 是一个字符串,因此您可以使用分隔符将 javascript 中的多个变量作为字符串传递,然后使用拆分它们快速侧的相同分隔符。 @SahilManchanda 谢谢 Sahil :) 这完全是关于从 Swift 到 Javascript 的通信。我如何从 JS 获取数据到 swift。请在这里查看我的问题***.com/questions/57551779/… 我想在 WKWebview 的 imageview 上显示一个服务器生成的图像! @RuchiraMore 我在那里回复了。但似乎这个问题与 swift 和 javascript 之间的通信无关 该操作正在使用 UIWebView,但您的解决方案引用了 WKWebView。您的解决方案不适用于 UIWebView。

以上是关于如何将值从 javascript 传递到 iOS UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

将值从 iOS 传递到 uiWebView

如何将值从 javascript 函数传递到 django 视图

如何将值从 javascript 传递到嵌入式 flex 对象?

如何使用 JavaScript 将值从一个 HTML 页面传递到另一个页面?

如何将值从javascript变量传递给剃刀变量?

通过使用 java 脚本,我如何将值从一个 html 页面传递到另一个 html 页面? [复制]