简体   繁体   English

在原生 safari 应用程序扩展中,我们如何从 swift 调用带有参数的 javascript 函数?

[英]In Native safari app extension How we can call a javascript function with argumemts from swift?

I just want to call a javascript function from swift file in safari app extension i tied a lot .我只想从 safari 应用程序扩展中的 swift 文件调用一个 javascript 函数,我绑定了很多。 I am new in swift do i dont know how to do so please help me out:我是 swift 的新手,我不知道该怎么做,请帮助我:

import SafariServices
import JavaScriptCore
import WebKit
class SafariExtensionHandler: SFSafariExtensionHandler,WKNavigationDelegate {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
        // This method will be called when a content script provided by your extension calls safari.extension.dispatchMessage("message").

        SFSafariApplication.getActiveWindow { (window) in
            window?.getActiveTab { (tab) in
                tab?.getActivePage(completionHandler: { (page1) in
                    page1?.webFrame.javaScriptContext.evaluateScript("myFunction('123')");
                })
            }
        }
    }
}

I am getting error:我收到错误:

[SFSafariPage webFrame]: unrecognized selector sent to instance [SFSafariPage webFrame]:无法识别的选择器发送到实例

I think the way it is described in the Apple documentation is to call a dispatchMessageToScript function in the file with your primary class aka the SafariExtensionHandler class and set up a listener on the javascript file to listen for the message that is dispatched and act on it according to the message.我认为Apple 文档中描述的方式是使用您的主类(即 SafariExtensionHandler 类)调用文件中的 dispatchMessageToScript 函数,并在 javascript 文件上设置一个侦听器以侦听已调度的消息并根据到消息。

So, the file with your primary class (SafariExtensionHandler.swift in my case) would look something like this.因此,包含您的主类(在我的情况下为 SafariExtensionHandler.swift)的文件看起来像这样。

import SafariServices

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
        // This method will be called when a content script provided by your extension calls safari.extension.dispatchMessage("message").
        if messageName == "GetWebsiteUrl" {
            page.dispatchMessageToScript(withName: "WebsiteUrl")
        }
    }
}

And the javascript file you're injecting would look something like this.您正在注入的 javascript 文件看起来像这样。

// Wait for the DOM to load before dispatching a message to the app extension's Swift code.
document.addEventListener("DOMContentLoaded", function(event) {
    safari.extension.dispatchMessage("GetWebsiteUrl");
});

// Listens for messages sent from the app extension's Swift code.
safari.self.addEventListener("message", messageHandler);

function messageHandler(event) {
    if(event.name === "WebsiteUrl"){
        console.log("WebsiteUrl >>>", document.URL)
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM