macOS 开发中实现 APP 的自重启

在日常使用某些 app 时,更改语言设置后 app 会提示“软件语言设置在重启后会生效”,有的软件也会提示是否立即重启,这说明我们能实现 app 的自重启,对吧!那么本文将介绍如何通过代码实现 app 的自重启。

实现平台

  • macOS 10.14.3
  • swift 4.2.1
  • xcode 10.1

新建 Cocoa App 工程

这里以一个新的空工程为例,所以首先要新建一个 Cocoa App 工程。简单说一下这个过程:

  1. 打开 Xcode,按下快捷键 Shift + Command + N 就会触发新建工程的导航窗口

  2. 选择 macOS -> Cocoa App,点击 Next

  3. 工程取名为 RelaunchDemo,勾选 Use Storyboards

添加重启接口

重启的原理很简单,就是在 app 退出前使用方法 NSWorkspace.shared.launchApplication 异步新启动一个 App 实例。

公共变量标记是否重启

为了保证重启操作和退出的区分,需要使用一个公共变量来标记 app 是否需要重启,如果需要重启再进行退出前的特殊操作。将这一变量定义在 AppDelegate.swift 中,这里注意的是要定义在 AppDelegate 类外,放在文件代码 import Cocoa 后即可:

var toRelaunch = false

只是标记,所以定义为 Bool 类型,初始化默认值为 false

App 退出前的特殊处理

app 退出前的处理可以在文件 AppDelegate.swiftAppDelegate 类的 applicationWillTerminate 方法中实现,实现如下:

if (toRelaunch) {
    NSWorkspace.shared.launchApplication(withBundleIdentifier: "top.smslit.RelaunchDemo", options: [NSWorkspace.LaunchOptions.async,  NSWorkspace.LaunchOptions.newInstance], additionalEventParamDescriptor: nil, launchIdentifier: nil)
}

这里要注意的是 withBundleIdentifier 要更改为您的 App 相应的 Bundle Identifier ,这个可以在工程配置信息的 General 中查看。程序启动选项使用的是:

  • NSWorkspace.LaunchOptions.async:启动 app 并异步返回结果
  • NSWorkspace.LaunchOptions.newInstance:生成新的实例对象

添加 APP 重启接口

重启的实现就是将 toRelaunch 设置为 true 后退出 App:

// 重启 App
func relaunchApp() {
    toRelaunch = true
    NSApplication.shared.terminate(true)
}

其实,只要是在程序退出前将 toRelaunch 置为 true ,App正常退出的话就会重启 APP。

使用按钮验证效果

为了看一下重启实现的效果,可以添加一个按钮,点击调用刚刚实现的重启方法 relaunchApp 就可以看到成果!

添加按钮

打开 Main.storyboard,按下 Shift + Command + l 组合键就会打开控件库选择器,搜索框搜索 button,找到 Push Button,点击拖入 View Controller 的中央,这样就完成了按钮的添加:

绑定 Action

下一步绑定 Action 实现点击行为。

  1. 点击 View Controller ,然后按下组合键 Option + Command + 回车 就会调出辅助编辑器
  2. 按住 Ctrl 键的同时,鼠标左键点中按钮不放,拖动至打开的辅助编辑器中的 View Controller 类中,出现 Insert Action or Outlet 提示的时候松手,出现弹窗
  3. 在弹窗中选择 Action ,name 取为 toRelaunchApp,点击 connect 就会在 View Controller 类中添加方法 toRelaunchApp
  4. 在方法中调用 relaunchApp 接口即可完成按钮对应的 Action

具体操作参考下面视频:

查看效果

点击 Xcode 左上角的运行按钮或按下组合键 Command + r 就会启动 App,在出现的窗口中就会看到我们添加的按钮,点击它就会发现 App 进行了重启,大功告成!

下载此 Demo: RelaunchDemo

参考