在本机 safari 应用程序扩展中,我们如何使用 swift 的参数调用 javascript 函数?

Posted

技术标签:

【中文标题】在本机 safari 应用程序扩展中,我们如何使用 swift 的参数调用 javascript 函数?【英文标题】:In Native safari app extension How we can call a javascript function with argumemts from swift? 【发布时间】:2019-02-20 11:09:01 【问题描述】:

我只想在我绑定了很多的 safari 应用扩展中的 swift 文件中调用一个 javascript 函数。 我是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')");
                )
            
        
    

我收到错误:

[SFSafariPage webFrame]:无法识别的选择器发送到实例

【问题讨论】:

【参考方案1】:

我认为Apple documentation 中描述的方式是使用您的主类(即 SafariExtensionHandler 类)在文件中调用 dispatchMessageToScript 函数,并在 javascript 文件上设置侦听器以侦听已调度的消息和根据消息采取行动。

因此,包含您的主类的文件(在我的例子中是 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")
        
    

你注入的 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)
    


【讨论】:

以上是关于在本机 safari 应用程序扩展中,我们如何使用 swift 的参数调用 javascript 函数?的主要内容,如果未能解决你的问题,请参考以下文章

带有 Safari 扩展的 Mac App Store 应用程序

Apple拒绝了Safari插件:“不使用自定义图标”

ios App:如何打开 facebook 链接并确保它是在 safari 而不是在本机应用程序中打开的?

使用应用扩展更改 Safari URL

如何在 Safari 应用程序扩展中获取活动选项卡?

如何从 safari 扩展中调用 python 函数