自动启动
注册应用,使其在 macOS、Windows 和 Linux 上于用户登录时启动
自动启动
app.Autostart可注册应用,使其在用户登录时自动启动。它会为每个平台选择合适的原生机制,并解析符号链接指向的安装路径(Homebrew、Scoop),因此二进制文件升级后注册不会失效。
注册会在下次登录时生效,而不是立即生效。
快速开始
import "github.com/wailsapp/wails/v3/pkg/application"
// Register to launch at login
if err := app.Autostart.Enable(); err != nil {
app.Logger.Error("autostart enable failed", "error", err)
}
// Stop launching at login
if err := app.Autostart.Disable(); err != nil {
app.Logger.Error("autostart disable failed", "error", err)
}
// Check status
enabled, err := app.Autostart.IsEnabled()API
Enable
使用默认选项注册应用,使其在登录时启动。
func (m *AutostartManager) Enable() error反复调用Enable是安全的——每次都会覆盖注册,因此,如果已持久保存用户的偏好设置,可以在每次启动时调用它。
EnableWithOptions
使用自定义选项进行注册。
func (m *AutostartManager) EnableWithOptions(opts AutostartOptions) errorAutostartOptions:
| 字段 | 类型 | 说明 |
|---|---|---|
Identifier |
string |
覆盖自动派生的注册 ID。请参阅下文的“标识符”。 |
Arguments |
[]string |
登录时启动应用时追加到可执行文件路径后的额外参数(例如--hidden)。 |
Disable
移除自动启动注册。如果应用尚未注册,则返回nil——禁用操作是幂等的。
func (m *AutostartManager) Disable() errorIsEnabled
报告注册是否存在。此操作速度很快,但不会验证已注册的路径。
func (m *AutostartManager) IsEnabled() (bool, error)Status
返回完整的注册状态。
func (m *AutostartManager) Status() (AutostartStatus, error)AutostartStatus:
| 字段 | 类型 | 说明 |
|---|---|---|
Enabled |
bool |
注册是否存在。 |
Path |
string |
注册产物在磁盘上的位置(plist 路径、.desktop路径或注册表子项)。当Enabled为 false 时为空。 |
Strategy |
AutostartStrategy |
注册应用时使用的机制(请参阅平台行为)。 |
平台行为
根据应用的打包方式,将使用以下两种机制之一:
- macOS 13+,已捆绑的
.app:SMAppService.mainAppService。适用于沙盒应用和 Mac App Store 构建。不会出现 TCC 自动化提示(过去的 AppleScript 方案会触发该提示)。 - 早于13的 macOS,或未捆绑的二进制文件:将包含
RunAtLoad=true的 LaunchAgent plist 写入~/Library/LaunchAgents/<identifier>.plist。
Status()返回AutostartStrategySMAppService或AutostartStrategyLaunchAgent,以便调用方判断使用了哪条路径。
当应用从未捆绑版本升级到已捆绑版本时,Status()会检查这两条路径,Disable()会进行清理,以免遗留的 LaunchAgent 继续启动旧版本。
在HKCU\Software\Microsoft\Windows\CurrentVersion\Run下添加一个注册表值,将值名称设为自动启动Identifier,并将数据设为带引号的可执行文件路径及任何Arguments。
参数引号处理遵循CommandLineToArgvW规则(引号前的反斜杠会加倍),因此包含空格或引号的路径可以正确往返转换。
Status().Strategy返回AutostartStrategyRegistryRun。
将 XDG 自动启动项写入$XDG_CONFIG_HOME/autostart/<identifier>.desktop(默认为~/.config/autostart/),其中包含:
Type=Application
Hidden=false
X-GNOME-Autostart-enabled=true
Exec=<executable> <arguments>Exec字段按照freedesktop.org Desktop Entry 规范进行转义——保留字符("、`、$、\\)使用反斜杠转义;当值包含空白字符时,使用双引号将其括起。
Status().Strategy返回AutostartStrategyXDGAutostart。
不支持。所有方法均返回ErrAutostartNotSupported。使用errors.Is(err, application.ErrAutostartNotSupported)可明确检测这种情况:
if err := app.Autostart.Enable(); err != nil {
if errors.Is(err, application.ErrAutostartNotSupported) {
// hide the toggle in the UI
return
}
// real failure — surface it
}标识符
如果Options.Identifier为空,则根据应用名称派生默认值:
| 平台 | 默认标识符 |
|---|---|
| macOS(已捆绑) | 应用的捆绑包标识符,例如com.example.MyApp |
| macOS(未捆绑) | wails.autostart.<slug>,其中<slug>派生自application.Options.Name |
| Windows | application.Options.Name的 slug(转换为小写、移除非A-Za-z0-9._-字符,并将空格替换为连字符) |
| Linux | 与 Windows 使用相同的 slug |
标识符必须匹配^[A-Za-z0-9._-]+$,且长度不得超过200个字符。建议在 macOS 上使用反向 DNS 格式(这与 launchd Label 的惯常写法一致)。
覆盖AutostartOptions.Identifier后,同一标识符将复用于 Windows 上的注册表值名称和 Linux 上的.desktop文件名,因此一个字符串即可跨平台标识该注册项。
失效项检测
Disable()和Status()通过将已注册的可执行文件路径与os.Executable()(解析所有符号链接后)进行匹配来定位注册项,而不是查找标识符。这意味着:
- 在不同版本之间更改标识符是安全的。只要可执行文件路径相同,仍可通过
Status()找到旧注册项,并由Disable()将其清理。 - 位于不同路径的第二个应用副本不会覆盖第一个副本的注册项。每个二进制文件位置都会单独跟踪。
- 通过符号链接安装的应用(Homebrew、Scoop)可保持稳定。匹配前会对
os.Executable()应用filepath.EvalSymlinks,因此 Homebrew 升级时即使替换链接目标,也不会遗留该注册项。
以下情况不在此机制的处理范围内:如果用户将二进制文件移动到无关路径或重命名,旧注册项将成为孤立项(它会指向当前已不存在的文件)。从固定安装路径发布的应用无需担心这一点;以便携式单文件二进制形式发布的应用应在移动自身之前调用Disable(),或者始终通过固定的符号链接启动。
示例
package main
import (
"errors"
"github.com/wailsapp/wails/v3/pkg/application"
)
func main() {
app := application.New(application.Options{
Name: "My App",
})
// Restore the user's preference on startup
if userPrefersAutostart() {
if err := app.Autostart.Enable(); err != nil {
if !errors.Is(err, application.ErrAutostartNotSupported) {
app.Logger.Error("autostart", "error", err)
}
}
}
app.Run()
}examples/autostart/中提供了一个包含状态、启用和禁用按钮的完整可运行示例。