Подтвердить что ты не робот

Chrome.app.isInstalled всегда возвращает false для расширений Google Chrome?

почему chrome.app.isInstalled всегда возвращает false для расширений Google Chrome?

Динамически я добавляю элемент ссылки на загрузку страницы:

<link type="text/css" rel="chrome-webstore-item" href="#" onclick="location.href='https://chrome.google.com/webstore/detail/itemID'; return false;">

Ниже приведен некоторый Javascript, который выполняется при нажатии кнопки:

if (!chrome.app.isInstalled) {
 alert('extension is about to be installed!');
 install_extension();
}else{
  alert('extension is installed already.');
}

В первый раз, когда я нажал кнопку, Google Chrome спросил меня, хочу ли я установить расширение. Я согласен, и расширение было установлено правильно. Когда я обновил страницу, я снова нажал кнопку, и Google Хром попросил меня установить расширение еще раз, даже когда я установил его 2 минуты назад. Другими словами, chrome.app.isInstalled всегда возвращает false, даже когда расширение установлено. Почему?

4b9b3361

Ответ 1

См. chrome.app.isInstalled Всегда возвращает как "false" :

chrome.app.isInstalled предназначен для использования размещенными приложениями (которые определяют набор URL-адресов, охватывающих приложение). Расширения могут вместо этого указывать, что они уже установлены, введя DOM node на страницу (см. Вторую половину https://developers.google.com/chrome/web-store/docs/inline_installation#already-installed).

В этой ссылке описывается стратегия тестирования, если установлено расширение:

  • Имейте содержимое script вставляйте DOM node на каждую страницу. Этот node должен иметь очень специфический идентификатор, например <div id='my-extension-installed-with-id-sdgdthsdfgdtyjufwknsdkos'>

  • Нажмите кнопку "Вкл.", проверьте свою страницу, если этот node существует.

  • Если существует node, выполняется содержимое script; поэтому устанавливается расширение. Если он не существует, предположим, что расширение не установлено.

Ввод DOM node не повлияет на состояние app.isInstalled. Вместо этого вы проверяете наличие DOM node в качестве доказательства присутствия расширений.

Ответ 2

Другим решением является использование externally_connectable.

Так как встроенная установка происходит с проверенного сайта, у вас есть установленный домен, на котором вы хотите проверить, существует ли это расширение. Пусть, скажем, example.com и его поддомены.

Затем вы можете определить следующее в своем манифесте:

"externally_connectable" : {
  "matches" : [
    "*://*.example.com/*"
  ]
}

Это выведет chrome.runtime.sendMessage в домен example.com.

Затем вы можете настроить прослушиватель сообщений для onMessageExternal в своем расширении, которое ответит на "ping" со страницы.

Подробнее см. этот ответ.

Ответ 3

Найдено простое решение, которое влияет только на одну страницу

Проверьте, начинается ли вкладка с URL-адреса вашего веб-сайта, так что сделайте небольшое изменение DOM.

chrome.tabs.query({active: true, currentWindow: true}, function (arrayOfTabs) {
    var tab = arrayOfTabs[0];

    if ( tab.url.indexOf('http://yoursite.com') === 0 ){
        chrome.tabs.executeScript({
                code: 'document.body.classList.add("your_сlass");'
        });
    }
});