macOS下SwiftUI应用无法退出系统偏好设置的问题求助
问题分析与解决
核心原因:App Sandbox 权限限制
你的SwiftUI应用默认启用了App Sandbox,这是macOS的安全机制,会限制应用的系统级操作,包括终止其他应用。而Playground没有Sandbox约束,所以代码能正常运行。terminate()返回false就是因为权限不足导致操作被拒绝。
解决方法
1. 关闭App Sandbox(自用场景推荐)
打开Xcode项目,进入Signing & Capabilities标签页,找到App Sandbox选项,取消勾选即可。
2. 保留Sandbox并申请特定权限
如果不想完全关闭Sandbox,可以添加权限允许应用向系统偏好设置发送Apple Events来终止它:
- 在
Info.plist中添加以下配置:
<key>com.apple.security.temporary-exception.apple-events</key> <array> <string>com.apple.systempreferences</string> </array>
- 改用Apple Events方式实现终止逻辑:
func quitSettings() { guard let appID = NSAppleScript(source: "id of application \"System Preferences\"")?.executeAndReturnError(nil).stringValue else { return } let script = NSAppleScript(source: "quit application id \"\(appID)\"") _ = script?.executeAndReturnError(nil) }
额外优化:调整执行时机
你在init中调用quitSettings()时,应用可能还未完成初始化流程。可以将调用延后到App启动完成后,比如在ContentView的onAppear中:
var body: some Scene { WindowGroup { ContentView() .onAppear { quitSettings() } } }
内容的提问来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

