app
控制应用程序的事件生命周期。
进程:主进程
下面的这个例子将会展示如何在最后一个窗口被关闭时退出应用:
const { app } = require('electron')
app.on('window-all-closed', () => {
app.quit()
})
事件
app
对象会发出以下事件:
事件: 'will-finish-launching'
当应用程序完成基础的启动的时候被触发。 在 Windows 和 Linux 中, will-finish-launching
事件与 ready
事件是相同的; 在 macOS 中,这个事件相当于 NSApplication
中的 applicationWillFinishLaunching
提示。
绝大部分情况下,你必须在ready
事件句柄中处理所有事务。
事件: 'ready'
返回:
event
EventlaunchInfo
Record<string, any> | NotificationResponse macOS
当 Electron 完成初始化时,发出一次。 在 macOS 上,如果通过通知中心启动应用程序,launchInfo
保存 NSUserNotification
的 userInfo
或 UNNotificationResponse
的信息。 你也可以通过调用 app.isReady()
来检查该事件是否已被触发,以及通过 app.whenReady()
得到一个当Electron已初始化后fulfill 的 Promise。
Note: The ready
event is only fired after the main process has finished running the first tick of the event loop. If an Electron API needs to be called before the ready
event, ensure that it is called synchronously in the top-level context of the main process.
事件: 'window-all-closed'
当所有的窗口都被关闭时触发。
如果你没有监听此事件并且所有窗口都关闭了,默认的行为是控制退出程序;但如果你监听了此事件,你可以控制是否退出程序。 如果用户按下了 Cmd + Q
,或者开发者调用了 app.quit()
,Electron 会首先关闭所有的窗口然后触发 will-quit
事件,在这种情况下 window-all-closed
事件不会被触发。
事件:'before-quit'
返回:
event
Event
在程序关闭窗口前发信号。 调用 event.preventDefault()
将阻止终止应用程序的默认行为。
注意: 如果由 autoUpdater.quitAndInstal()
退出应用程序 ,那么在所有窗口触发 close
之后 才会触发 before-quit
并关闭所有窗口。
**注:**在 Windows 系统中,如果应用程序因系统关机/重启或用户注销而关闭,那么这个事件不会被触发。
事件: 'will-quit'
返回:
event
Event
当所有窗口被关闭后触发,同时应用程序将退出。 调用 event.preventDefault()
将阻止终止应用程序的默认行为。
关于 window-all-closed
和 will-quit
事件之间的差异, 请参见 window-all-closed
事件的说明。
**注:**在 Windows 系统中,如果应用程序因系统关机/重启或用户注销而关闭,那么这个事件不会被触发。
事件: 'quit'
返回:
event
EventexitCode
Integer
在应用程序退出时发出。
**注:**在 Windows 系统中,如果应用程序因系统关机/重启或用户注销而关 闭,那么这个事件不会被触发。
事件: 'open-file' macOS
返回:
event
Eventpath
string
当用户想要在应用中打开一个文件时发出。 open-file
事件通常在应用已经打开,并且系统要再次使用该应用打开文件时发出。 open-file
也会在一个文件被拖到 dock 并且还没有运行的时候发出。 请确认在应用启动的时候(甚至在 ready
事件发出前) 就对 open-file
事件进行监听。
如果你想处理这个事件,你应该调用 event.preventDefault()
。
在 Windows 系统中,你需要解析 process.argv
(在主进程中) 来获取文件路径
事件: 'open-url' macOS
返回:
event
Eventurl
string
当用户想要在应用中打开一个 URL 时发出。 你的应用程序的 Info. plist
文件必须在 CFBundleURLTypes
这个key中定义 url scheme, 并将 NSPrincipalClass
设置为 AtomApplication
。
As with the open-file
event, be sure to register a listener for the open-url
event early in your application startup to detect if the application is being opened to handle a URL. If you register the listener in response to a ready
event, you'll miss URLs that trigger the launch of your application.
事件: 'activate' macOS
返回:
event
EventhasVisibleWindows
boolean
当应用被激活时发出。 各种操作都可以触发此事件, 例如首次启动应用程序、尝试在应用程序已运行时或单击应用程序的坞站或任务栏图标时重新激活它。
事件: 'did-become-active' macOS
返回:
event
Event
Emitted when the application becomes active. This differs from the activate
event in that did-become-active
is emitted every time the app becomes active, not only when Dock icon is clicked or application is re-launched. It is also emitted when a user switches to the app via the macOS App Switcher.
事件: 'did-rele-active' macOS
返回:
event
Event
Emitted when the app is no longer active and doesn’t have focus. This can be triggered, for example, by clicking on another application or by using the macOS App Switcher to switch to another application.
Event: 'continue-activity' macOS
返回:
event
Eventtype
string-标识活动的字符串。 Maps toNSUserActivity.activityType
.userInfo
unknown - 包含另一个设备上activity存储的应用特定状态。details
ObjectwebpageURL
string (可选) - 如果可用,可识别另一设备上活动访问的网页的 URL 的字符串。
Emitted during Handoff when an activity from a different device wants to be resumed. 如果你想处理这个事件,你应该调用 event.preventDefault()
。
只有具有支持相应的活动类型并且相同的开发团队 ID 作为启动程序时,用户行为才会进行。 所支持活动类型已在应用的 Info.plist
中的 NSUserActivityTypes
里明确定义。
Event: 'will-continue-activity' macOS
返回:
event
Eventtype
string-标识活动的字符串。 Maps toNSUserActivity.activityType
.
Emitted during Handoff before an activity from a different device wants to be resumed. 如果你想处理这个事件,你应该调用 event.preventDefault()
。
Event: 'continue-activity-error' macOS
返回:
event
Eventtype
string-标识活动的字符串。 Maps toNSUserActivity.activityType
.error
string - 详细的错误信息
Emitted during Handoff when an activity from a different device fails to be resumed.
Event: 'activity-was-continued' macOS
返回:
event
Eventtype
string-标识活动的字符串。 Maps toNSUserActivity.activityType
.userInfo
unknown - 包含activity存储的应用特定状态。
Emitted during Handoff after an activity from this device was successfully resumed on another one.
Event: 'update-activity-state' macOS
返回:
event
Eventtype
string-标识活动的字符串。 Maps toNSUserActivity.activityType
.userInfo
unknown - 包含activity存储的应用特定状态。
Emitted when Handoff is about to be resumed on another device. 如果需要更新要传输的状态,你应该立即调用 event.preventDefault()
, 构造新的 userInfo
字典,并及时调用 app.updateCurrentActiviy()
。 否则,操作会失败,并且触发 continue-activity-error
事件: 'new-window-for-tab' macOS
返回:
event
Event
当用户点击原生的macOS新标签按钮时触发。 只有在当前 BrowserWindow
有 tabbingIdentifier
时,新建tab按钮才可见。
事件: 'browser-window-blur'
返回:
event
Eventwindow
BrowserWindow
当一个 browserWindow 失去焦点时触发。
事件: 'browser-window-focus'
返回:
event
Eventwindow
BrowserWindow
当一个 browserWindow 获得焦点时触发。
事件: 'browser-window-created'
返回:
event
Eventwindow
BrowserWindow
当一个新的 browserWindow 被创建时触发。
事件: 'web-contents-created'
返回:
event
EventwebContents
WebContents
当一个新的 webContents 被创建时触发。
事件: 'certificate-error'
返回:
event
EventwebContents
WebContentsurl
stringerror
string - 错误码certificate
Certificatecallback
FunctionisTrusted
boolean - 是否将证书视为受信任。
isMainFrame
boolean
当对 url
的 certificate
证书验证失败的时候发出。如果需要信任这个证书,你需要阻止默认行为 event.preventDefault()
并且调用 callback(true)
。
const { app } = require('electron')
app.on('certificate-error', (event, webContents, url, error, certificate, callback) => {
if (url === 'https://github.com') {
// Verification logic.
event.preventDefault()
callback(true)
} else {
callback(false)
}
})
事件: 'select-client-certificate'
返回:
event
EventwebContents
WebContentsurl
URLcertificateList
Certificate[]callback
Functioncertificate
Certificate (optional)
当一个客户证书被请求的时候发出。
url
指的是请求客户端认证的网页地址,调用 callback
时需要传入一个证书列表中的证书。 需要通过调用 event.preventDefault()
来防止应用自动使用第一个证书进行验证。
const { app } = require('electron')
app.on('select-client-certificate', (event, webContents, url, list, callback) => {
event.preventDefault()
callback(list[0])
})
事件: "login"
返回:
event
EventwebContents
WebContents (optional)authenticationResponseDetails
Objecturl
URLpid
number
authInfo
ObjectisProxy
booleanscheme
stringhost
stringport
Integerrealm
string
callback
Functionusername
string (可选)password
string (可选)
Emitted when webContents
or Utility process wants to do basic auth.
默认行为是取消所有身份验证。 默认行为是取消所有的验证行为,如果需要重写这个行为,你需要用 event.preventDefault()
来阻止默认行为,并且使用 callback(username, password)
来验证。
const { app } = require('electron')
app.on('login', (event, webContents, details, authInfo, callback) => {
event.preventDefault()
callback('username', 'secret')
})
当 callback
在缺少用户名和密码的时候被调用,身份验证请求将被取消,同时将返回身份验证错误到页面。
事件: 'gpu-info-update'
每当有 GPU 信息更新时触发。
事件: 'render-process-gone'
返回:
event
EventwebContents
WebContentsdetails
RenderProcessGoneDetails
渲染器进程意外消失时触发。 这种情况通常因为进程崩溃或被杀死。
事件: 'child-process-gone'
返回:
event
Eventdetails
Objecttype
string - 进程类型。 以下值之一:Utility
Zygote
Sandbox helper
GPU
Pepper Plugin
Pepper Plugin Broker
Unknown
reason
string - 子进程结束的原因。 可选值:clean-exit
- 以零为退出代码退出的进程abnormal-exit
- 以非零退出代码退出的进程killed
- 进程发送一个SIGTERM,否则是被外部杀死的。crashed
- 进程崩溃oom
- 进程内存不足launch-failed
- 进程从未成功启动integrity-failure
- 窗口代码完整性检查失败
exitCode
number - 进程的退出代码(例如. posix 中 waitpid 和 Windows 中 GetExitCodeProcess 的状态)。serviceName
string (可选) - 进程的非本地化名称。name
string (可选) - 进程的名称。 功能性示例:Audio Service
,Content Decryption Module Service
,Network Service
,Video Capture
, 等等。
子进程意外消失时触发。 这种情况通常因为进程崩溃或被杀死。 子进程不包括渲染器进程。
事件: "accessibility-support-changed" _ macOS _ _ Windows _
返回:
event
EventaccessibilitySupportEnabled
boolean - 当开启了 Chrome 辅助功能支持为true
,否则为false
。
当 Chrome 的辅助功能状态改变时触发。 当启用或禁用辅助技术时将触发此事件,例如屏幕阅读器 。 查看更多详情 https://www.chromium.org/developers/design-documents/accessibility
事件:'session-created'
返回:
session
Session
当 Electron创建了一个新的 session
后被触发.
const { app } = require('electron')
app.on('session-created', (session) => {
console.log(session)
})
事件: 'second-instance'
返回:
event
Eventargv
string[] - 第二实例命令行参数的数组。workingDirectory
string - 第二实例的工作目录。additionalData
unknown - 第二个实例发送过来的额外的 JSON 对象
当第二个实例被执行并且调用 app.requestSingleInstanceLock()
时,这个事件将在你的应用程序的首个实例中触发
argv
是第二个实例的命令行参数的数组, workingDirectory
是这个实例当前工作目录。 通常, 应用程序会激活窗口并且取消最小化来响应。
Note: argv
will not be exactly the same list of arguments as those passed to the second instance. The order might change and additional arguments might be appended. If you need to maintain the exact same arguments, it's advised to use additionalData
instead.
注意: 如果第二个实例是由不同于第一个实例的用户启动的。 argv
数组不包含参数。
保证在 app
的 ready
事件发出后发出此事件。
注意: 额外的命令行参数可能是被 Chromium 添加的,例如 --original-process-start-time
。
方法
app
对象具有以下方法:
** 注意: **某些方法仅在特定的操作系统上可用, 这些方法会被标记出来。
app.quit()
尝试关闭所有窗口 将首先发出 before-quit
事件。 如果所有窗口都已成功关闭, 则将发出 will-quit
事件, 并且默认情况下应用程序将终止。
此方法会确保执行所有beforeunload
和 unload
事件处理程序。 可以在退出窗口之前的beforeunload
事件处理程序中返回false
取消退出。
app.exit([exitCode])
exitCode
Integer (可选)
使用 exitCode
立即退出。 exitCode
默认为0。
所有窗口都将立即被关闭,而不询问用户,而且 before-quit
和 will-quit
事件也不会被触发。
app.relaunch([options])
从当前实例退出,重启应用。
默认情况下,新的实例将会使用和当前实例相同的工作目录以及命令行参数。 当设置了 args
参数时, args
将作为命令行参数传递。 当设置了 execPath
,execPath
将被执行以重新启动,而不是当前的应用程序。
请注意, 此方法在执行时不会退出当前的应用程序, 你需要在调用 app.relaunch
方法后再执行 app. quit
或者 app.exit
来让应用重启。
当 app.relaunch
被多次调用时,多个实例将在当前实例退出后启动。
立即重启当前实例并向新的实例添加新的命令行参数的示例:
const { app } = require('electron')
app.relaunch({ args: process.argv.slice(1).concat(['--relaunch']) })
app.exit(0)
app.isReady()
如果 Electron 已完成初始化返回 boolean
- true
,否则 false
。 另见 app.whenReady()
。
app.whenReady()
返回 Promise<void>
- 当Electron 初始化完成。 可用作检查 app.isReady()
的方便选择,假如应用程序尚未就绪,则订阅ready
事件。
app.focus([options])
在 Linux 上,使第一个可见窗口获得焦点。 在 macOS上,将应用程序变成激活的app。 在 Windows上,使应用程序的第一个窗口获得焦点。
你应该尽可能少地使用 steal
选项。
app.hide()
macOS
隐藏所有的应用窗口,不是最小化.
app.isHidden()
macOS
返回 boolean
- 如果应用的所有窗口都被隐藏(比如在 MacOS 系统下使用了 Command-H
快捷键)则为 true
,否则返回 false
。
app.show()
macOS
显示隐藏后的应用程序窗口。 不会使它们自动获得焦点。
app.setAppLogsPath([path])
path
string (可选) - 自定义日志路径。 必须是绝对路径。
设置或创建一个您的应用程序日志目录,然后可以通过 app.getPath()
或 app.setPath(pathName, newPath)
进行操作。
调用 app.setAppLogsPath()
却没有指定 path
参数将导致此目录在 macOS 下被设置为 ~/Library/Logs/YourAppName
;在 Linux 和_Windows_ 下将被设置到 userData
目录中。
app.getAppPath()
返回 string
- 当前应用程序目录。
app.getPath(name)
name
string - 您可以通过名称请求以下路径:home
用户的 home 文件夹(主目录)appData
每个用户的应用程序数据目录,默认情况下指向:%APPDATA%
Windows 中$XDG_CONFIG_HOME
or~/.config
Linux 中~/Library/Application Support
macOS 中
userData
储存你应用程序配置文件的文件夹,默认是appData
文件夹附加应用的名称 按照习惯用户存储的数据文件应该写在此目录,同时不建议在这写大文件,因为某些环境会备份此目录到云端存储。sessionData
此目录存储由Session
生成的数据,例如 localStorage,cookies,磁盘缓存,下载的字典,网络 状态,开发者工具文件等。 默认为userData
目录。 Chromium 可能在此处写入非常大的磁盘缓存,因此,如果您的应用不依赖于浏览器存储(如 localStorage 或 cookie)来保存用户数据,建议将此目录设置为其他位置,以避免污染userData
目录。temp
临时文件夹exe
当前的可执行文件module
Thelibchromiumcontent
库desktop
当前用户的桌面文件夹documents
用户文档目录的路径downloads
用户下载目录的路径music
用户音乐目录的路径pictures
用户图片目录的路径videos
用户视频目录的路径recent
用户最近文件的目录 (仅限 Windows)。logs
应用程序的日志文件夹crashDumps
崩溃转储文件存储的目录。
返回 string
- 与 name
关联的目录或文件的路径。 失败会抛出一个Error
。
If app.getPath('logs')
is called without called app.setAppLogsPath()
being called first, a default log directory will be created equivalent to calling app.setAppLogsPath()
without a path
parameter.
app.getFileIcon(path[, options])
path
string
返回 Promise<NativeImage>
- 一个 NativeImage 类型的应用图标的 fulfilled。
读取文件的关联图标。
在 Windows 上,有 2 种图标:
- 与某些文件扩展名相关联的图标, 比如
. mp3
,. png
等。 - 文件本身就带图标,像是
.exe
,.dll
,.ico
在 Linux 和 macOS 上,图标依赖于与应用程序关联的文件 mime 类型。
app.setPath(name, path)
name
stringpath
string
重写 name
的路径为 path
,一个特定的文件夹或者文件。 如果路径指向一个不存在的目录,则抛出一个 Error
。 在这种情况下,目录应该以 fs.mkdirSync
或类似的方式创建。
name
参数只能使用 app.getPath
定义过的 name
默认, 网页的 cookies 和 缓存 将存储在 sessionData
目录下。 如果要更改此位置,你必须在 app
模块的 ready
事件之前重写 sessionData
路径。
app.getVersion()
返回 string
- 加载应用程序的版本号。 如果应用程序的 package. json
文件中找不到版本号, 则返回当前包或者可执行文件的版本。
app.getName()
返回 string
- 当前应用程序的名称,即为该应用程序 package.json
文件的 name 字段。
根据 npm 的命名规则, 通常 package.json
中的 name
字段是一个短的小写字符串。 通常还应该指定一个 productName
字段, 是首字母大写的完整名称,用于表示应用程序的名称。Electron 会优先使用这个字段作为应用名。
app.setName(name)
name
string
设置当前应用程序的名字
注意: 此函数会覆盖Electron内部使用的名称;它不会影响操作系统使用的名称。
app.getLocale()
返回 string
- 当前应用程序区域,使用 Chromium's l10n_util
库获取。 可能返回区域的值 文档 here。
若要设置区域,需要在应用启动时使用命令行参数,可在此处找到相于信息 here。
注意: 当分发打包的应用时,也必须打包 locales
文件夹。
注意: 该 API 必须在 ready
事件触发后调用。
**注意:**要查看此 API 与其他语言环境和语言 API 相比的示例返回值,请参阅 app.getPreferredSystemLanguages()