当我们在macos上打开一个app,我们操作app打开了一堆窗口,如果这个时候我们不关闭这些窗口,而是直接退出应用。那么默认情况下,我们再次启动时,macos就会恢复打开上次使用的窗口。这种情况在xcode开发应用我们调试应用的过程中最容易出现。
假如你不希望你的应用重启时,恢复到上次用户打开的窗口,而是想每次都从启动页开始。那么怎么做呢?
通过摸索尝试n次后,我找到了一种可行的方法。
先来理解macos是怎么恢复一个应用的:
当我们操作app打开一些窗口时,macos会在~/Library/Containers/{your app bundleIdentifier}/Data/Library/Saved Application State/
目录下,以你应用的bundleIdentifier加“.savedState”创建一个用于存储应用状态的目录:~/Library/Containers/{your app bundleIdentifier}/Data/Library/Saved Application State/{your app bundleIdentifier}.savedState
,然后在这个目录下存储应用的状态。
我们只需要在适当的时候,删除这个目录就可以。
class MyAppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
print("applicationDidFinishLaunching")
// 在这里删除没用,此时已经读取了,还是会恢复状态
// clearSavedApplicationState()
}
// 是否在最后一个窗口关闭后终止进程
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
// 不终止进程,只是清理一下状态
print("applicationShouldTerminateAfterLastWindowClosed")
clearSavedApplicationState()
return false
}
func applicationWillTerminate(_ aNotification: Notification) {
print("applicationWillTerminate")
clearSavedApplicationState()
}
// 删除状态文件,阻止下次启动应用还恢复之前的窗口
func clearSavedApplicationState() {
// 获取应用程序的 bundle identifier
let bundleIdentifier = Bundle.main.bundleIdentifier!
// 构建 Saved Application State 目录的路径
let savedStateDirectory = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0]
let savedStatePath = savedStateDirectory.appendingPathComponent("Saved Application State").appendingPathComponent("\(bundleIdentifier).savedState").path
// 检查文件夹是否存在
if FileManager.default.fileExists(atPath: savedStatePath) {
do {
// 尝试删除文件夹及其内容
try FileManager.default.removeItem(atPath: savedStatePath)
print("Saved application state cleared successfully.")
} catch {
// 如果删除失败,打印错误信息
print("Error clearing saved application state: \(error)")
}
} else {
print("Saved application state directory \(savedStatePath) does not exist.")
}
}
}
@main
struct MyApp: App {
@NSApplicationDelegateAdaptor(MyAppDelegate.self) var appDelegate: MyAppDelegate
......
}
你可能关心的点:
- 本地xcode开发启动应用,也是这个目录,跟应用发布后是一致的,至少在macOS14.x版本的系统上验证是这个结论。
- 关于沙盒环境下有没有权限删除这个目录,实测是成功的。
此篇文章的结论都是我在应用发版后确认得出。