Chrome 分机从 backgroundjs 中的 onInstall 发送消息到自己的分机 javascript 代码

Chrome extension send message from onInstall in backgroundjs to own extension javascript code

我需要检查扩展何时安装并相应地更改我的 React 状态。 我在我的 background.js 上使用 chrome.runtime.onInstalled,其中我 sendMessage 到我的反应代码 - 这是我的扩展的内容脚本。

background.js

 async function getCurrentTab() {
  let queryOptions = { active: true, currentWindow: true };
  let [tab] = await chrome.tabs.query(queryOptions);
  return tab;
}
chrome.runtime.onInstalled.addListener((details) => {
  if (details?.reason === 'install') {
    console.log('installed backgroundjs')

    const tab = await getCurrentTab()
   chrome.tabs.sendMessage(tab.id, { target: 'onInstall' })
    openNewTab()
   }
 })

In my react Component - Dashboard.js

useEffect(() => {
    if (extensionApiObject?.runtime) {
      chrome.runtime.sendMessage({ target: 'background', message: 'check_installation', })

      console.log('extension')
      chrome.runtime.onMessage.addListener(handleMessage)
    }


    return () => {
      if (extensionApiObject?.runtime) {
        chrome.runtime.onMessage.removeListener(handleMessage)
      }
    }
  })

function handleMessage(msg) {
    console.log('handle messag func', msg)

    if (msg.target === 'onInstall') {
      console.log('extension on Install')
      setShowWelcomeMessage(true)
    }
  }

让我感到困惑的是,我已经对不同的消息进行了类似的实现,可以正常工作,但在那里我听的是 chrome.runtime.onMessage() 而不是 chrome.runtime.onInstalled()

我想知道我是否误解了 onInstalled 方法的工作原理,我无法从中发送消息?

更新: 我按照@wOxxOm 的建议更改了我的代码,我使用了 chrome.tabs.sendMessage 但仍然没有运气。

chrome.runtime.onInstalled 不像其他侦听器那样将 req、sender、sendResponse 作为参数,我想知道这是否意味着它无法从那里发送消息:/

根据@wOxxOm 的建议,我最终删除了 sendMessage 解决方案,并在安装后每次打开新选项卡时向 url 添加一个额外参数:

background.js

function openNewTab(param) {
  chrome.tabs.create({
    url:  param ? `chrome://newtab?${param}` : 'chrome://newtab',
  })
}

chrome.runtime.onInstalled.addListener((details) => {
  if (details?.reason === 'install') {
   chrome.tabs.sendMessage(tab.id, { target: 'onInstall' })
    openNewTab('installed')
   }
 })

在我的网络应用程序上,我只需要检查参数,我就可以决定要显示哪个 UI