0

safari.application.activeBrowserWindow.tabs従来の拡張機能では、拡張機能に登録されているすべてのタブにメッセージを送信するために反復処理を行うことができました。

新しい Safari アプリの拡張機能で利用できる同等のものはありますか?

私はドキュメントを調べてきましたが、この非常に基本的なことを達成する方法についてのヒントは見つかりませんでした.

恐ろしい回避策は、すべてのタブが Swift バックグラウンドに ping を実行することですが、実際にはこれは非常に基本的なことであり、利用できないか、ドキュメントでカバーされていないように思えます。何か不足していますか?

また、タブが閉じられるまでSFSafariPage参照が保持されることを期待して、「messageReceived」ハンドラーによって表示されるすべての「ページ」インスタンスの弱いマップを保持しようとしましたが、代わりにほとんどすぐに失われ、実際よりも多くのメッセージチャネルであることを示唆していますサファリのページ。

4

1 に答える 1

2

方法は次のようにする必要があります:injected.jsメッセージを app-ext に送信します。

document.addEventListener("DOMContentLoaded", function (event) {
    safari.extension.dispatchMessage('REGISTER_PAGE')
})

そして app-ext では、次のように smth で処理します。

var pages: [SFSafariPage] = []

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
        switch messageName {
        case "REGISTER_PAGE":
            if !pages.contains(page) {
                pages.append(page)
            }
        default:
            return
        }
    }

}

さて、次のように、実行時に開いているすべてのページにメッセージを送信できます。

for p in pages {
    p.dispatchMessageToScript(withName: "message name", userInfo: userInfo)
}

ハッキーに見えますが、それでも実行可能です。楽しみ :)

于 2018-11-20T15:40:10.720 に答える