Swift 和 Javascript 集成

Posted

技术标签:

【中文标题】Swift 和 Javascript 集成【英文标题】:Swift and Javascript Integration 【发布时间】:2016-10-13 07:46:53 【问题描述】:

我一直在关注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("Hello from JavaScript");

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

    window.webkit.messageHandlers.callbackHandler

    另一个问题可能是在本地调用中使用超时。移除超时并添加一个按钮来调用 messageHandler。

【讨论】:

以上是关于Swift 和 Javascript 集成的主要内容,如果未能解决你的问题,请参考以下文章

swift 笔记:iOS与JavaScript的交互(一):UIWebView - 2.1直接使用字符串通过评估Java脚本(来自:)

swift集成友盟统计

从 swift 4 调用贝宝 javascript 函数

从使用 wkwebview 返回值的 javascript 调用 swift 函数

Javascript中,实现类与集成的方法和优缺点分析

Paytm 支付网关 java web 集成 - servlet 调用中的 jsp 示例有时由于提交中的 javascript 而无法正常工作