You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:14:52