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

实现平台

  • macOS 10.14.3
  • swift 4.2.1
  • xcode 10.1

1. 新建 Cocoa App 工程

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

  • 打开 Xcode,按下快捷键 Shift + Command + N 就会触发新建工程的导航窗口
  • 选择 macOS -> Cocoa App,点击 Next

  • 工程取名为 RelaunchDemo,勾选 Use Storyboards

2. 添加重启介面

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

2.1 公共变数标记是否重启

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

var toRelaunch = false

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

2.2 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:生成新的实例对象

2.3 添加 APP 重启介面

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

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

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

3. 使用按钮验证效果

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

3.1 添加按钮

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

3.2 绑定 Action

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

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

具体操作参考下面视频:

视频封面

00:23绑定按钮的Action

3.3 查看效果

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

下载此 Demo:

RelaunchDemo?

pichome-1254392422.cos.ap-chengdu.myqcloud.com

参考

Cocoa 怎样重新启动app (application relaunching)?

blog.csdn.net

NSWorkspace | Apple Developer Documentation?

developer.apple.com


博客原文:

macOS 开发中实现 APP 的自重启?

www.smslit.top
图标

推荐阅读:
相关文章