当前位置: 首页 > 面试题库 >

Swift Webview:如何从JavaScript正确调用Swift代码?

阙阳夏
2023-03-14
问题内容

我正在尝试使我的javascript与快速代码交互,但不幸的是我没有成功。

目前,我只是尝试更改标题的颜色并显示一条消息,如下面的代码所示。

这是我的( index.html )代码:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>WebView Test</h1>
        <script type="text/javascript" src="main.js"></script>
    </body>
</html>

这是我的( main.js -JavaScript )代码:

function callNativeApp () {
    try {
        webkit.messageHandlers.callbackHandler.postMessage("Send from JavaScript");
    } catch(err) {
        console.log('error');
    }
}

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

function redHeader() {
    document.querySelector('h1').style.color = "red";
}

这是我的( ViewController.swift )代码:

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {

    @IBOutlet var containerView : UIView! = nil

    var webView: WKWebView?

    override func loadView() {
        super.loadView()

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

        var config = WKWebViewConfiguration()
        config.userContentController = contentController

        self.webView = WKWebView()
        self.view = self.webView!
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var url = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("index", ofType: "html")!)
        var req = NSURLRequest(URL: url)
        self.webView!.loadRequest(req)
    }

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

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

问题答案:

您已正确设置了所有内容,但没有将WKWebViewConfiguration实例分配给WKWebView。由于配置包含Javascript /
Swift桥的详细信息,因此您无法来回交谈。

override func loadView() {
    // ...
    var config = WKWebViewConfiguration()
    config.userContentController = contentController

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


 类似资料:
  • 问题内容: 我正在尝试从Swift调用CCKeyDerivationPBKDF。 我已经在Project-Bridging-Header.h中导入了所需的标头: (顺便说一句,在我的项目中导入其他Objective C代码时,桥接头似乎正常工作)。 在Xcode中,我可以从.swift文件跳转到此处显示的定义: 最后,当我尝试像这样调用函数时: …我得到这个编译器错误: 无法使用类型为’(CCPB

  • 我所要做的就是从我的服务器调用我的Java代码。jsp页面。我写了一些。一个webapp的jsp页面,但随着项目的发展,我想开始将一些代码放入其中。java类或servlet。 为什么Eclipse不能“看到”my/src或/lib/web或/WebContent或/WebContent/src或/WebContent/web-INF/lib或/WebContent/web-INF/src中的所有

  • 问题内容: 有没有办法从Swift调用C例程? 许多iOS / Apple库仅是C语言,我仍然希望能够调用它们。 例如,我希望能够从Swift调用objc运行时库。 特别是,如何桥接iOS C标头? 问题答案: 是的,您当然可以与Apples C库进行交互。这里说明了如何。 基本上,C型,C指针等被翻译成对象斯威夫特,例如C 在夫特是一个。 我为另一个问题构建了一个小例子,该例子可以作为对C和Sw

  • 问题内容: 如果可以的话,如何在Wicket的JavaScript代码中调用Java代码(例如方法)。 问题答案: 呃 正确的答案应该是ajax回调。您可以手动将js编码为挂钩到wicket js,也可以在java中通过wicket组件设置回调。例如,从AjaxLazyLoadPanel中: 本示例说明如何将回调代码添加到Wicket中的任何组件。在浏览器中触发OnDomReady事件后,加载页面

  • 问题内容: 我们如何从Android调用javascript?我有一个我想使用的javascript库,我想调用javascript函数并将结果值传递给android java代码。从现在开始还没有找到答案。我设法从javascript调用android代码,但我想反过来。 问题答案: 有一个hack: 绑定一些Java对象,以便可以使用WebView从Javascript调用它: 通过以下方式强

  • 问题内容: 我正在iOS上使用SceneKit开发一些代码,在我的代码中,我想确定全局z平面上的x和y坐标,其中z为0.0,而x和y由轻击手势确定。我的设置如下: 如你看到的。我有一个三角形,该三角形的高度为4个单位,宽为4个单位,并设置在以x,y(0.0,0.0)为中心的z平面(z = 0)上。相机是默认的SCNCamera,它沿负z方向看,我将其放置在(0,0,15)处。zNear和zFar的