通过 Swift 中的 UIWebView 从 Javascript 传递数组

Pass an Array from Javascript via UIWebView in Swift

本文关键字:数组 Javascript Swift 中的 UIWebView 通过      更新时间:2023-09-26

我必须在项目中使用UIWebView,我似乎遇到了问题。

好吧,我有如下html。

<html>
<a onclick="myFunction(1)">element1</a>
<a onclick="myFunction(2)">element1</a>
<a onclick="myFunction(3)">element1</a>
</html>

当我点击 href 链接时,我必须执行我的 javascript 代码

<script>
var arr = [];
function myFunction(number) {
    arr.push(number);
}
</script>

现在我怎样才能把Array传给UIViewController

以及我如何迅速知道我是否从UIWebView打电话给myFunction()

您可以使用

WKWebView ,自OS X 10.10或iOS 8起可用。在 Xcode 9 及更高版本中,您可以将WkWebView直接添加到界面生成器并连接IBOutlet。对于早期版本的 Xcode,您必须以编程方式执行此操作。为了完全兼容,下面的代码演示如何以编程方式添加WKWebView

使您的视图控制器符合WKScriptMessageHandler协议并添加以下代码:

class ViewController: UIViewController, WKScriptMessageHandler {
    weak var webView: WKWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // myAction is the pipe name Javascript uses to post messages
        // to your app. You can define more than 1 pipe.
        let controller = WKUserContentController()
        controller.addScriptMessageHandler(self, name: "myAction")
        let config = WKWebViewConfiguration()
        config.userContentController = controller
        // Add the WKWebView to the view
        let frame = CGRectMake(20, 20, 200, 200)
        let webView = WKWebView(frame: frame, configuration: config)
        self.view.addSubview(webView)
        // Load your HTML file
        let url = NSBundle.mainBundle().URLForResource("mydoc", withExtension: "html")!
        webView.loadFileURL(url, allowingReadAccessToURL: url)
        // Pass reference to the view controller
        self.webView = webView
    }
    // Handle the message posted by Javascript
    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
        if let arr = message.body as? [Int] {
            print(arr)
        }
    }
}

HTML + Javascript:

<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8">
        <title>Hello world</title>
        <script type="text/javascript">
        var arr = [];
        function myFunction(number) {
            arr.push(number);
            // Send a message to your app on the myAction pipe
            window.webkit.messageHandlers.myAction.postMessage(arr);
        }
        </script>
    </head>
    <body>
        <a href="javascript:void(0)" onclick="myFunction(1)">element1</a>
        <a href="javascript:void(0)" onclick="myFunction(2)">element2</a>
        <a href="javascript:void(0)" onclick="myFunction(3)">element3</a>
    </body>
</html>