app 模塊是為了控制整個(gè)應(yīng)用的生命周期設(shè)計(jì)的。
下面的這個(gè)例子將會(huì)展示如何在最后一個(gè)窗口被關(guān)閉時(shí)退出應(yīng)用:
var app = require('app'); app.on('window-all-closed', function() { app.quit(); });
app 對象會(huì)觸發(fā)以下的事件:
當(dāng)應(yīng)用程序完成基礎(chǔ)的啟動(dòng)的時(shí)候被觸發(fā)。在 Windows 和 Linux 中, will-finish-launching 事件與 ready 事件是相同的; 在 OS X 中, 這個(gè)時(shí)間相當(dāng)于 NSApplication 中的 applicationWillFinishLaunching 提示。 你應(yīng)該經(jīng)常在這里為 open-file 和 open-url 設(shè)置監(jiān)聽器,并啟動(dòng)崩潰報(bào)告和自動(dòng)更新。
在大多數(shù)的情況下,你應(yīng)該只在 ready 事件處理器中完成所有的業(yè)務(wù)。
當(dāng) Electron 完成初始化時(shí)被觸發(fā)。
當(dāng)所有的窗口都被關(guān)閉時(shí)觸發(fā)。
這個(gè)時(shí)間僅在應(yīng)用還沒有退出時(shí)才能觸發(fā)。 如果用戶按下了 Cmd + Q, 或者開發(fā)者調(diào)用了 app.quit() ,Electron 將會(huì)先嘗試關(guān)閉所有的窗口再觸發(fā) will-quit 事件, 在這種情況下 window-all-closed 不會(huì)被觸發(fā)。
返回:
在應(yīng)用程序開始關(guān)閉它的窗口的時(shí)候被觸發(fā)。 調(diào)用 event.preventDefault() 將會(huì)阻止終止應(yīng)用程序的默認(rèn)行為。
返回:
當(dāng)所有的窗口已經(jīng)被關(guān)閉,應(yīng)用即將退出時(shí)被觸發(fā)。 調(diào)用 event.preventDefault() 將會(huì)阻止終止應(yīng)用程序的默認(rèn)行為。
你可以在 window-all-closed 事件的描述中看到 will-quit 事件 和 window-all-closed 事件的區(qū)別。
返回:
當(dāng)應(yīng)用程序正在退出時(shí)觸發(fā)。
返回:
當(dāng)用戶想要在應(yīng)用中打開一個(gè)文件時(shí)觸發(fā)。open-file 事件常常在應(yīng)用已經(jīng)打開并且系統(tǒng)想要再次使用應(yīng)用打開文件時(shí)被觸發(fā)。 open-file 也會(huì)在一個(gè)文件被拖入 dock 且應(yīng)用還沒有運(yùn)行的時(shí)候被觸發(fā)。 請確認(rèn)在應(yīng)用啟動(dòng)的時(shí)候(甚至在 ready 事件被觸發(fā)前)就對 open-file 事件進(jìn)行監(jiān)聽,以處理這種情況。
如果你想處理這個(gè)事件,你應(yīng)該調(diào)用 event.preventDefault() 。 在 Windows系統(tǒng)中,你需要通過解析 process.argv 來獲取文件路徑。
返回:
當(dāng)用戶想要在應(yīng)用中打開一個(gè)url的時(shí)候被觸發(fā)。URL格式必須要提前標(biāo)識(shí)才能被你的應(yīng)用打開。
如果你想處理這個(gè)事件,你應(yīng)該調(diào)用 event.preventDefault() 。
返回:
當(dāng)應(yīng)用被激活時(shí)觸發(fā),常用于點(diǎn)擊應(yīng)用的 dock 圖標(biāo)的時(shí)候。
返回:
當(dāng)一個(gè) BrowserWindow 失去焦點(diǎn)的時(shí)候觸發(fā)。
返回:
當(dāng)一個(gè) BrowserWindow 獲得焦點(diǎn)的時(shí)候觸發(fā)。
返回:
當(dāng)一個(gè) BrowserWindow 被創(chuàng)建的時(shí)候觸發(fā)。
返回:
當(dāng)對 url 驗(yàn)證 certificate 證書失敗的時(shí)候觸發(fā),如果需要信任這個(gè)證書,你需要阻止默認(rèn)行為 event.preventDefault() 并且 調(diào)用 callback(true)。
session.on('certificate-error', function(event, webContents, url, error, certificate, callback) { if (url == "https://github.com") { // 驗(yàn)證邏輯。 event.preventDefault(); callback(true); } else { callback(false); } });
返回:
當(dāng)一個(gè)客戶端認(rèn)證被請求的時(shí)候被觸發(fā)。
url 指的是請求客戶端認(rèn)證的網(wǎng)頁地址,調(diào)用 callback 時(shí)需要傳入一個(gè)證書列表中的證書。
需要通過調(diào)用 event.preventDefault() 來防止應(yīng)用自動(dòng)使用第一個(gè)證書進(jìn)行驗(yàn)證。如下所示:
app.on('select-certificate', function(event, host, url, list, callback) { event.preventDefault(); callback(list[0]); })
返回:
當(dāng) webContents 要做進(jìn)行一次 HTTP 登陸驗(yàn)證時(shí)被觸發(fā)。
默認(rèn)情況下,Electron 會(huì)取消所有的驗(yàn)證行為,如果需要重寫這個(gè)行為,你需要用 event.preventDefault() 來阻止默認(rèn)行為,并且 用 callback(username, password) 來進(jìn)行驗(yàn)證。
app.on('login', function(event, webContents, request, authInfo, callback) { event.preventDefault(); callback('username', 'secret'); })
當(dāng) GPU 進(jìn)程崩潰時(shí)觸發(fā)。
app 對象擁有以下的方法:
請注意 有的方法只能用于特定的操作系統(tǒng)。
試圖關(guān)掉所有的窗口。before-quit 事件將會(huì)最先被觸發(fā)。如果所有的窗口都被成功關(guān)閉了, will-quit事件將會(huì)被觸發(fā),默認(rèn)下應(yīng)用將會(huì)被關(guān)閉。
這個(gè)方法保證了所有的 beforeunload 和 unload 事件處理器被正確執(zhí)行。假如一個(gè)窗口的 beforeunload事件處理器返回 false,那么整個(gè)應(yīng)用可能會(huì)取消退出。
隱藏所有的應(yīng)用窗口,不是最小化.
隱藏后重新顯示所有的窗口,不會(huì)自動(dòng)選中他們。
帶著exitCode退出應(yīng)用.
所有的窗口會(huì)被立刻關(guān)閉,不會(huì)詢問用戶。before-quit 和 will-quit 這2個(gè)事件不會(huì)被觸發(fā)
返回當(dāng)前應(yīng)用所在的文件路徑。
返回一個(gè)與 name 參數(shù)相關(guān)的特殊文件夾或文件路徑。當(dāng)失敗時(shí)拋出一個(gè) Error 。
你可以通過名稱請求以下的路徑:
重寫某個(gè) name 的路徑為 path,path 可以是一個(gè)文件夾或者一個(gè)文件,這個(gè)和 name 的類型有關(guān)。 如果這個(gè)路徑指向的文件夾不存在,這個(gè)文件夾將會(huì)被這個(gè)方法創(chuàng)建。 如果錯(cuò)誤則會(huì)拋出 Error。
name 參數(shù)只能使用 app.getPath 中定義過 name。
默認(rèn)情況下,網(wǎng)頁的 cookie 和緩存都會(huì)儲(chǔ)存在 userData 文件夾。 如果你想要改變這個(gè)位置,你需要在 app 模塊中的 ready 事件被觸發(fā)之前重寫 userData 的路徑。
返回加載應(yīng)用程序的版本。如果應(yīng)用程序的 package.json 文件中沒有寫版本號, 將會(huì)返回當(dāng)前包或者可執(zhí)行文件的版本。
返回當(dāng)前應(yīng)用程序的 package.json 文件中的名稱。
由于 npm 的命名規(guī)則,通常 name 字段是一個(gè)短的小寫字符串。但是應(yīng)用名的完整名稱通常是首字母大寫的,你應(yīng)該單獨(dú)使用一個(gè) productName 字段,用于表示你的應(yīng)用程序的完整名稱。Electron 會(huì)優(yōu)先使用這個(gè)字段作為應(yīng)用名。
重寫當(dāng)前應(yīng)用的名字
返回當(dāng)前應(yīng)用程序的語言。
在最近訪問的文檔列表中添加 path。
這個(gè)列表由操作系統(tǒng)進(jìn)行管理。在 Windows 中您可以通過任務(wù)條進(jìn)行訪問,在 OS X 中你可以通過 dock 菜單進(jìn)行訪問。
清除最近訪問的文檔列表。
將 tasks 添加到 Windows 中 JumpList 功能的 Tasks 分類中。
tasks 中的 Task 對象格式如下:
Task Object
動(dòng)態(tài)設(shè)置是否總是為 HTTP NTLM 或 Negotiate 認(rèn)證發(fā)送證書。通常來說,Electron 只會(huì)對本地網(wǎng)絡(luò)(比如和你處在一個(gè)域中的計(jì)算機(jī))發(fā) 送 NTLM / Kerberos 證書。但是假如網(wǎng)絡(luò)設(shè)置得不太好,可能這個(gè)自動(dòng)探測會(huì)失效,所以你可以通過這個(gè)接口自定義 Electron 對所有 URL 的行為。
這個(gè)方法可以讓你的應(yīng)用在同一時(shí)刻最多只會(huì)有一個(gè)實(shí)例,否則你的應(yīng)用可以被運(yùn)行多次并產(chǎn)生多個(gè)實(shí)例。你可以利用這個(gè)接口保證只有一個(gè)實(shí)例正 常運(yùn)行,其余的實(shí)例全部會(huì)被終止并退出。
如果多個(gè)實(shí)例同時(shí)運(yùn)行,那么第一個(gè)被運(yùn)行的實(shí)例中 callback 會(huì)以 callback(argv, workingDirectory)的形式被調(diào)用。其余的實(shí)例 會(huì)被終止。 argv 是一個(gè)包含了這個(gè)實(shí)例的命令行參數(shù)列表的數(shù)組,workingDirectory 是這個(gè)實(shí)例目前的運(yùn)行目錄。通常來說,我們會(huì)用通過將應(yīng)用在 主屏幕上激活,并且取消最小化,來提醒用戶這個(gè)應(yīng)用已經(jīng)被打開了。
在 app 的 ready 事件后,callback 才有可能被調(diào)用。
如果當(dāng)前實(shí)例為第一個(gè)實(shí)例,那么在這個(gè)方法將會(huì)返回 false 來保證它繼續(xù)運(yùn)行。否則將會(huì)返回 true 來讓它立刻退出。
在 OS X 中,如果用戶通過 Finder、open-file 或者 open-url 打開應(yīng)用,系統(tǒng)會(huì)強(qiáng)制確保只有一個(gè)實(shí)例在運(yùn)行。但是如果用戶是通過 命令行打開,這個(gè)系統(tǒng)機(jī)制會(huì)被忽略,所以你仍然需要靠這個(gè)方法來保證應(yīng)用為單實(shí)例運(yùn)行的。
下面是一個(gè)簡單的例子。我們可以通過這個(gè)例子了解如何確保應(yīng)用為單實(shí)例運(yùn)行狀態(tài)。
var myWindow = null; var shouldQuit = app.makeSingleInstance(function(commandLine, workingDirectory) { // 當(dāng)另一個(gè)實(shí)例運(yùn)行的時(shí)候,這里將會(huì)被調(diào)用,我們需要激活應(yīng)用的窗口 if (myWindow) { if (myWindow.isMinimized()) myWindow.restore(); myWindow.focus(); } return true; }); // 這個(gè)實(shí)例是多余的實(shí)例,需要退出 if (shouldQuit) { app.quit(); return; } // 創(chuàng)建窗口、繼續(xù)加載應(yīng)用、應(yīng)用邏輯等…… app.on('ready', function() { });
改變當(dāng)前應(yīng)用的 Application User Model ID 為 id.
如果 DWM composition(Aero Glass) 啟用 了,那么這個(gè)方法會(huì)返回 true,否則是 false。你可以用這個(gè)方法來決定是否要開啟透明窗口特效,因?yàn)槿绻脩魶]開啟 DWM,那么透明窗 口特效是無效的。
舉個(gè)例子:
let browserOptions = {width: 1000, height: 800}; // 只有平臺(tái)支持的時(shí)候才使用透明窗口 if (process.platform !== 'win32' || app.isAeroGlassEnabled()) { browserOptions.transparent = true; browserOptions.frame = false; } // 創(chuàng)建窗口 win = new BrowserWindow(browserOptions); // 轉(zhuǎn)到某個(gè)網(wǎng)頁 if (browserOptions.transparent) { win.loadURL('file://' + __dirname + '/index.html'); } else { // 沒有透明特效,我們應(yīng)該用某個(gè)只包含基本樣式的替代解決方案。 win.loadURL('file://' + __dirname + '/fallback.html'); }
通過可選的參數(shù) value 給 Chromium 中添加一個(gè)命令行開關(guān)。
注意 這個(gè)方法不會(huì)影響 process.argv,我們通常用這個(gè)方法控制一些底層 Chromium 行為。
給 Chromium 中直接添加一個(gè)命令行參數(shù),這個(gè)參數(shù) value 的引號和格式必須正確。
注意 這個(gè)方法不會(huì)影響 process.argv。
當(dāng)傳入的是 critical 時(shí),dock 中的應(yīng)用將會(huì)開始彈跳,直到這個(gè)應(yīng)用被激活或者這個(gè)請求被取消。
當(dāng)傳入的是 informational 時(shí),dock 中的圖標(biāo)只會(huì)彈跳一秒鐘。但是,這個(gè)請求仍然會(huì)激活,直到應(yīng)用被激活或者請求被取消。
這個(gè)方法返回的返回值表示這個(gè)請求的 ID。
取消這個(gè) id 對應(yīng)的請求。
設(shè)置應(yīng)用在 dock 中顯示的字符串。
返回應(yīng)用在 dock 中顯示的字符串。
隱藏應(yīng)用在 dock 中的圖標(biāo)。
顯示應(yīng)用在 dock 中的圖標(biāo)。
設(shè)置應(yīng)用的 dock 菜單.
設(shè)置應(yīng)用在 dock 中顯示的圖標(biāo)。
更多建議: