Hi Dai Gei Ho~ 我是Winnie ~
如果說 昨日的內容是學會內部溝通,那麼在今天文章中,我們要來學習與外界溝通,所以在此篇文章中我們要繼續延續上篇內容, 將剩下的內容補充完,主要會探討跨 Extension 間溝通傳遞的方法。
不管是 一次性請求 還是 長時間請求,在與外部 Extension 進行資料的相互傳遞,其實使用方式都大同小異,因為他們傳遞方式同樣 都是 使用 chrome.runtime.sendMessage()
與 port.postMessage()
方法來進行傳遞。
更多
chrome.runtime.sendMessage()
與port.postMessage()
使用詳見上篇文章。
唯一不同的地方在於 監聽訊息接收的方法 與 傳遞對象的指定。
發送方式: 透過chrome.runtime.sendMessage
傳送訊息時,需第一個參數指定傳送對象的 Extension ID。
let extensionId = ....
chrome.runtime.sendMessage( extensionId ,{msg: 'Hi i am Extension 1'})
接收方式:
chrome.runtime.onMessageExternal.addListener(
(request, sender, sendResponse)=>{});
與 內部Extension 監聽方式的不同, 我們需要透過 chrome.runtime.onMessageExternal.addListener()
方法來接收外部傳遞的訊息。
發送方式:
同樣需透過chrome.runtime.connect()
來
let port = chrome.runtime.connect(laserExtensionId);
port.postMessage(...);
接收方式:
寫法與原本的一樣,只是改成chrome.runtime.onConnectExternal.addListener
事件監聽方法來接收外部傳遞的訊息。
chrome.runtime.onConnectExternal.addListener((port)=>{
port.onMessage.addListener((msg)=>{
});
});
以下為範例:
在這邊需要提醒下大家,今天實作了一整天 才發現 跨 Extension 傳遞訊息,接收端只能是 運行於 Extension 端的Cotext,如: Background、popup 等,而在 Content Script 這不能以接收訊息的來監聽,只能以發送端來傳遞訊息 給 其他 Context,
這是為什麼呢?
透過實作結果與各方解答,歸納出了以下原因:
事情是這樣的,昨天我們有介紹到如果要傳遞訊息給 ContentScript ,需特定的 Tab ID 才能傳遞訊息到特定頁面,但跨 Extension 間傳遞 是兩個獨立執行環境,無法向內部環境一樣可以知道對方 CotentScript 當前所在的頁籤ID,而這也就表示當不知道對方所在位置,訊息無法傳遞到指定的頁面,進而導致chrome.runtime.onMessageExternal
或 chrome.runtime.onConnectExternal
監聽器不能使用的問題。
以上就是關於 跨 Extension 間的 訊息傳遞 應用補充,
關於實作範例檔,說來慚愧,
由於當前實作程式檔有點雜都還沒整理好,有點抱歉,後續會統整再一起放上來。
那今天文章先到這邊了,謝謝願意花時間看此篇文章的你,如果文章有錯誤的地方,再麻煩不吝嗇的給予指教,感謝!!
今日有感而發:
有一句話一直記在心裡『心裡不要想著距離,距離就不在你的想像以內。』
明天是9/16,所以想推薦 地球上最浪漫的一首歌