2013-08-16 2 views
13

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

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

<link type="text/css" rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/itemID"> 

Ниже некоторые 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, даже когда расширение установлено. Почему?

ответ

15

См chrome.app.isInstalled Always Returns as "false":

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

Этой ссылка описывает стратегию для тестирования, если установлен вашего добавочного номера:

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

  2. На кнопке нажмите, чтобы проверить страницу, если этот узел существует.

  3. Если узел существует, выполняется скрипт содержимого; поэтому устанавливается расширение. Если он не существует, предположим, что расширение не установлено.

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

+6

О, я вижу. Я хотел бы, чтобы это было более ясно в документах. Тем не менее, я по-прежнему считаю, что Chrome должен иметь что-то вроде chrome.ext.isInstalled, чтобы упростить его. – user2070775

6

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

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

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

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

Это подвергнет chrome.runtime.sendMessage к домену example.com.

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

Для получения дополнительной информации см. this answer.

+0

Это хорошо работает и для упакованных приложений. –

0

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

Проверьте, если вкладка начинается с 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");' 
     }); 
    } 
}); 
Смежные вопросы