在日常使用某些 app 时,更改语言设置后 app 会提示「软体语言设置在重启后会生效」,有的软体也会提示是否立即重启,这说明我们能实现 app 的自重启,对吧!那么本文将介绍如何通过代码实现 app 的自重启。
这里以一个新的空工程为例,所以首先要新建一个 Cocoa App 工程。简单说一下这个过程:
Shift
Command
N
Next
Use Storyboards
重启的原理很简单,就是在 app 退出前使用方法 NSWorkspace.shared.launchApplication 非同步新启动一个 App 实例。
NSWorkspace.shared.launchApplication
为了保证重启操作和退出的区分,需要使用一个公共变数来标记 app 是否需要重启,如果需要重启再进行退出前的特殊操作。将这一变数定义在 AppDelegate.swift 中,这里注意的是要定义在 AppDelegate 类外,放在文件代码 import Cocoa 后即可:
AppDelegate.swift
AppDelegate
import Cocoa
var toRelaunch = false
只是标记,所以定义为 Bool 类型,初始化默认值为 false。
Bool
false
app 退出前的处理可以在文件 AppDelegate.swift 的 AppDelegate 类的 applicationWillTerminate 方法中实现,实现如下:
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 中查看。程序启动选项使用的是:
withBundleIdentifier
Bundle Identifier
General
NSWorkspace.LaunchOptions.async
NSWorkspace.LaunchOptions.newInstance
重启的实现就是将 toRelaunch 设置为 true 后退出 App:
toRelaunch
true
// 重启 App func relaunchApp() { toRelaunch = true NSApplication.shared.terminate(true) }
其实,只要是在程序退出前将 toRelaunch 置为 true ,App正常退出的话就会重启 APP。
为了看一下重启实现的效果,可以添加一个按钮,点击调用刚刚实现的重启方法 relaunchApp 就可以看到成果!
relaunchApp
打开 Main.storyboard,按下 Shift + Command + l 组合键就会打开控制项库选择器,搜索框搜索 button,找到 Push Button,点击拖入 View Controller 的中央,这样就完成了按钮的添加:
Main.storyboard
l
Push Button
View Controller
下一步绑定 Action 实现点击行为。
Option
回车
Ctrl
Insert Action or Outlet
Action
toRelaunchApp
具体操作参考下面视频:
点击 Xcode 左上角的运行按钮或按下组合键 Command + r 就会启动 App,在出现的窗口中就会看到我们添加的按钮,点击它就会发现 App 进行了重启,大功告成!
r
下载此 Demo:
Cocoa 怎样重新启动app (application relaunching)?blog.csdn.netNSWorkspace | Apple Developer Documentation?developer.apple.com
博客原文: