2010-03-08 38 views
80

扩展如何才能发现它是第一次运行还是刚刚更新,以便扩展可以执行某些特定操作? (例如打开帮助页面或更新设置)检测Chrome扩展第一次运行/更新

+0

迁移到superuser.com – 2010-03-08 05:13:27

+25

不一定。我认为这可能是一个编程问题,如果rack1正在编写chrome扩展。 – 2010-03-08 05:20:53

+0

为什么你没有选择这个? http://stackoverflow.com/a/14957674/4548520它是正确的anwser - 第一次扩展安装的正式活动 – user25 2016-08-04 20:21:08

回答

9

简单。当扩展第一次运行时,localStorage是空的。在第一次运行时,您可以在那里写一个标记,将所有后续运行标记为非第一次。

例,在background.htm:

var first_run = false; 
if (!localStorage['ran_before']) { 
    first_run = true; 
    localStorage['ran_before'] = '1'; 
} 

if (first_run) alert('This is the first run!'); 

编辑:要检查是否延长刚刚更新,一个简单的标志的第一次运行,而不是存储的版本,则在当前的扩展版本(通过XmlHttpRequest清单得到)不等于存储在localStorage中的那个,扩展已更新。

+0

小心不要在内容脚本中这样做。 localStorage与页面上的其他代码和扩展共享。所以这不适用于内容脚本。 – huyz 2011-07-20 01:52:08

+0

对于打包的应用程序,这确实是一个在后台页面中使用的明确解决方案,因为打包应用程序的'localStorage'确实在其独立的窗口中,并且不会像@huyz提到的那样与页面上的其他代码和扩展共享。然而,对于扩展,情况并非如此。 – 2014-01-26 01:13:33

+0

**这需要存储权限。** – Pacerier 2017-09-10 10:19:54

64

如果你想检查是否延长已安装或更新,你可以做这样的事情:

function onInstall() { 
    console.log("Extension Installed"); 
    } 

    function onUpdate() { 
    console.log("Extension Updated"); 
    } 

    function getVersion() { 
    var details = chrome.app.getDetails(); 
    return details.version; 
    } 

    // Check if the version has changed. 
    var currVersion = getVersion(); 
    var prevVersion = localStorage['version'] 
    if (currVersion != prevVersion) { 
    // Check if we just installed this extension. 
    if (typeof prevVersion == 'undefined') { 
     onInstall(); 
    } else { 
     onUpdate(); 
    } 
    localStorage['version'] = currVersion; 
    } 
+0

如果我在Gmail中的内容脚本中运行getVersion(),则会获取Gmail应用程序版本的编号。我应该指出有一些问题会阻止这种类型的脚本工作:a)当您安装一个需要将内容脚本注入页面并且该页面已被加载的插件时,内容脚本会执行没有被注入页面,页面必须重新加载)。b)获取插件的版本号可以从后台脚本中完成,但后台脚本无法访问localStorage,只有内容脚本可以,尚未加载... – 2011-12-18 03:59:15

+3

这篇文章很棒...你应该把这个标记为答案。感谢穆罕默德! – frenetix 2012-02-02 14:36:04

+3

@VictorS上述内容旨在用于背景页面中,如果您计划在内容脚本中使用此内容,则只需直接调用chrome.app.getDetails()。版本。之前我之前获得版本的原因是因为在Chrome扩展开发的早期阶段,没有chrome.app对象,所以我们不得不使用XHR清单。你可以在封闭的情况下做所有这些,这样你就可以保证你调用正确的方法。我通常将所有内容封装在类对象中。 – 2012-02-02 23:13:33

139

在Chrome中的新版本(因为Chrome的22),则可以使用chrome.runtime.onInstalled事件,这更清洁。

例子:

// Check whether new version is installed 
chrome.runtime.onInstalled.addListener(function(details){ 
    if(details.reason == "install"){ 
     console.log("This is a first install!"); 
    }else if(details.reason == "update"){ 
     var thisVersion = chrome.runtime.getManifest().version; 
     console.log("Updated from " + details.previousVersion + " to " + thisVersion + "!"); 
    } 
}); 
+2

谢谢你!我在互联网上发现的所有内容都是将扩展的版本存储在localStorage中,直到我最终偶然发现了这个答案,这当然是一个可行的解决方案,但我很惊讶,因为Chrome并没有内置任何东西!我很高兴我没有失望:) – JMTyler 2013-09-11 00:38:37

+2

自2012年9月发布Chrome 22以来 – Redzarf 2013-12-12 11:44:19

+1

chrome.runtime.onInstalled检测应用程序或扩展程序在后台安装的时间。然而,它没有做的事情是检测到chrome.app.runtime.onLaunched事件的第一次触发... – 2014-01-26 01:16:52

14

幸运的是,现在有events这个(因为Chrome浏览器版本22和25的更新事件)。

对于已安装的事件:

chrome.runtime.onInstalled.addListener(function() {...}); 

对于OnUpdateAvailable事件:

chrome.runtime.onUpdateAvailable.addListener(function() {...}); 

从开发文档约OnUpdateAvailable一个重要摘录说:

时更新被触发可用,但不会立即安装,因为该应用程序当前正在运行。如果您什么都不做,则会在下次卸载后台页面时安装更新,如果您希望更快安装该更新,则可以显式调用chrome.runtime.reload()。