macOS 开发中实现 APP 的自重启
在日常使用某些 app 时,更改语言设置后 app 会提示“软件语言设置在重启后会生效”,有的软件也会提示是否立即重启,这说明我们能实现 app 的自重启,对吧!那么本文将介绍如何通过代码实现 app 的自重启。
实现平台
- macOS 10.14.3
- swift 4.2.1
- xcode 10.1
新建 Cocoa App 工程
这里以一个新的空工程为例,所以首先要新建一个 Cocoa App 工程。简单说一下这个过程:
-
打开 Xcode,按下快捷键
Shift
+Command
+N
就会触发新建工程的导航窗口 -
选择 macOS -> Cocoa App,点击
Next
-
工程取名为 RelaunchDemo,勾选
Use Storyboards
添加重启接口
重启的原理很简单,就是在 app 退出前使用方法 NSWorkspace.shared.launchApplication
异步新启动一个 App 实例。
公共变量标记是否重启
为了保证重启操作和退出的区分,需要使用一个公共变量来标记 app 是否需要重启,如果需要重启再进行退出前的特殊操作。将这一变量定义在 AppDelegate.swift
中,这里注意的是要定义在 AppDelegate
类外,放在文件代码 import Cocoa
后即可:
var toRelaunch = false
只是标记,所以定义为 Bool
类型,初始化默认值为 false
。
App 退出前的特殊处理
app 退出前的处理可以在文件 AppDelegate.swift
的 AppDelegate
类的 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 实现点击行为。
- 点击
View Controller
,然后按下组合键Option
+Command
+回车
就会调出辅助编辑器 - 按住
Ctrl
键的同时,鼠标左键点中按钮不放,拖动至打开的辅助编辑器中的View Controller
类中,出现Insert Action or Outlet
提示的时候松手,出现弹窗 - 在弹窗中选择
Action
,name 取为toRelaunchApp
,点击 connect 就会在View Controller
类中添加方法toRelaunchApp
- 在方法中调用
relaunchApp
接口即可完成按钮对应的 Action
具体操作参考下面视频:
查看效果
点击 Xcode 左上角的运行按钮或按下组合键 Command
+ r
就会启动 App,在出现的窗口中就会看到我们添加的按钮,点击它就会发现 App 进行了重启,大功告成!
下载此 Demo: RelaunchDemo