簡體   English   中英

如何在 safari 應用程序和從 safari 應用程序擴展資源文件夾加載的 html 頁面之間進行通信

[英]how to communicate between safari app and html page loaded from safari app extension resources folder

我正在嘗試構建一個簡單的 safari 應用擴展。 about:blank我從擴展的資源文件夾中加載了一個 html 頁面。 以下是代碼。

//script.js - injected script
if(window.location.href=="about:blank"){
    window.location.href = safari.extension.baseURI + "page.html";
}

我想要這個加載的頁面和 safari 應用程序之間的通信。 顯然注入的腳本script.js在加載的 html 頁面上不可用

我嘗試將script.js鏈接到 html 頁面內聯,但safari對象本身不適用於safari.extension.dispatchMessagesafari.self.addEventListener

編輯:
有了這個(注入的腳本 script.js 在加載的 html 頁面/選項卡上不可用)我的意思是在資源選項卡中打開 web 檢查器時,我們看不到任何extension scripts

如果我正確理解您的問題,您需要在頁面的 javascript 和 Safari 應用程序擴展的本機主機應用程序之間進行通信。 只能使用 API safari.extension.dispatchMessage聯系宿主應用程序,該 API 只能從注入的script.js腳本訪問,而不能從頁面的 JS 訪問。

您可以通過從頁面發送請求事件並注冊響應事件來解決此問題。 您的 HTML 頁面將包含腳本:

function sendEventToInjected() {
    var storeEvent = new CustomEvent('myCustomEvent', {"detail": "testData"});
    document.dispatchEvent(storeEvent);

    var responseEventID = 'myResponseEvent';
    document.addEventListener(responseEventID, function respListener(event)
    {
        console.log("Got data from injected script: " + event.detail);
        document.removeEventListener(responseEventID, respListener);
    });
}

您的script.js將通過注冊事件偵聽器來捕獲此事件,然后可以將數據傳遞給擴展的本機主機應用程序。 獲取到本地主機的響應后,可以將響應事件調度回頁面。

document.addEventListener("myCustomEvent", function(event) {
    console.log("myCustomEvent:" + event.detail);
    safari.extension.dispatchMessage(event.detail);
});

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

function messageHandler(event)
{
    var resp = {detail: "respData"};
    var respEvent = new CustomEvent('myResponseEvent', resp);
    document.dispatchEvent(respEvent);
}

您可能不會將頁面“重新定位”到 safari-extensions:// url,而是從 Safari App Extension 獲取要顯示的 HTML 代碼(使用消息傳遞),然后將代碼插入 about:blank 頁面。 結果將是相同的,除了頁面 url 將保持 about:blank

這看起來像是Apple的錯誤。 我已經向 BugReporter 提交了一份。

您可以向 HTML 添加零高度iframe以“強制注入”擴展腳本。

<!DOCTYPE html>
<html lang=en>
   <head>
      <title>My Extension!</title>
   </head>
   <body>
      <noscript><strong>We're sorry but App doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript>
      <p>Hi!</p>
      <iframe id="myID" src="https://example.com" height="0" style="border: none;"></iframe>
   </body>
</html>

這是可能的JS:

function handleMessage(event) {
    console.log(event.name);
    console.log(event.message);
}

if (window.top === window) {
   document.addEventListener("DOMContentLoaded", function(event) {
       console.log("[app] Content loaded: main");
       safari.extension.dispatchMessage("Hello from Main!");
       safari.self.addEventListener("message", handleMessage);
   });
} else {
   document.addEventListener("DOMContentLoaded", function(event) {
       console.log("[app] Content loaded: iframe");
       safari.extension.dispatchMessage("Hello from iframe!");
       safari.self.addEventListener("message", handleMessage);
   });
}

結果:

圖 1 圖 2 圖 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM