javascript - Swift 和 JavaScript 集成

标签 javascript ios swift wkwebview

我一直在关注this article关于集成Swift(WKWebView)和Javascript。文章中的所有内容都工作正常,但我试图将一些变量从Swift传递到Javascript。

这是我在 Swift 中的 ViewController:

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {

    @IBOutlet var containerView : UIView! = nil
    var webView: WKWebView?

    override func loadView() {
        super.loadView()

        let contentController = WKUserContentController();
        let userScript = WKUserScript(
            source: "redHeader()",
            injectionTime: WKUserScriptInjectionTime.AtDocumentEnd,
            forMainFrameOnly: true
        )
        contentController.addUserScript(userScript)
        contentController.addScriptMessageHandler(
            self,
            name: "callbackHandler"
        )

        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        self.webView = WKWebView(
            frame: self.view.frame,
            configuration: config
        )
        self.view = self.webView!
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string:"https://example.com")
        let req = NSURLRequest(URL:url!)
        self.webView!.loadRequest(req)

        let simpleInt = 123

        self.webView?.evaluateJavaScript("redHeader(\(simpleInt)", completionHandler: nil);
    }

    func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
        if(message.name == "callbackHandler") {
            print("JavaScript is sending a message \(message.body)")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

这就是驻留在服务器上的HTML 和 JS:

function callNativeApp () {
    try {
        webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
    } catch(err) {
        console.log('The native context does not exist yet');
    }
}

setTimeout(function () {
    callNativeApp();
}, 50000);

function redHeader(int) {
	console.log(int);
}
<!DOCTYPE html>
<html>
    <head>
        <style type="text/css">
            body {
                padding-top: 40px; 
            }
        </style>
        <title>WKWebView Demo</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>WKWebView Test</h1>
        <script type="text/javascript" src="main.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    </body>
</html>

这仍然只是上面文章中的代码,但我无法将变量 simpleInt 传递给 JS。

尽管 Javascript 调用

webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");

效果不太好。

我认为我传递的变量是错误的。有什么建议吗?

最佳答案

有一些事情你可以尝试

  1. 您的方法调用中缺少窗口

    webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
    

    应该是

    window.webkit.messageHandlers.callbackHandler.postMessage("来自 JavaScript 的问候");

  2. 检查您是否能够从浏览器打开调试菜单访问此 Check for enabling debug mode 的消息处理程序

    window.webkit.messageHandlers.callbackHandler

Result

  • 另一个问题可能是在 native 调用中使用超时。删除超时并添加一个按钮来调用 messageHandler。
  • 关于javascript - Swift 和 JavaScript 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015162/

    相关文章:

    javascript - 如何让polymer.js 软件报告错误/异常?

    javascript - 限制在 loadmore 上不起作用

    ios - 当 UITextField 达到最大字符数时,键盘上的“完成”按钮将不起作用

    ios - 从 Swift 函数中的异步调用返回数据

    ios - UICollectionView 在单元格外渲染图像

    ios - 解除 UISearchBar 键盘后取消按钮消失

    javascript - Odoo:JavaScript。无法访问某些 View 结构

    javascript - iOS WKWebview 未响应 <a href ="javascript:doSomething()"...></a> 上的点击事件

    ios - touchID 实现错误已被用户取消

    ios - 多个 TableView 行选择 - Swift