设置访问

Platforms | macOS 11 Xcode 15 License: MIT

Xcode 16 更新

注意

Xcode 16 现在将 Apple 之前私有的 openSettings 环境方法公开,并将其向后移植到 macOS 14。

虽然这是一个值得欢迎的进步,但这仍然只是渐进式的,在许多情况下仍然需要 SettingsAccess 的绝大部分功能。

SettingsAccess 2.0.0 通过将其 openSettings 方法重命名为 openSettingsLegacy,增加了对使用 Xcode 16 编译的支持。对于目标 macOS 14+ 的项目,您可以选择使用新的原生 openSettings 方法。对于目标 macOS 较旧版本的项目,请使用 openSettingsLegacy

为什么

截至 macOS 14 Sonoma

解决方案

请参阅下面的入门指南以获取示例用法。

局限性

使用软件包

Swift Package Manager (SPM)

使用 Swift Package Manager 将 SettingsAccess 添加为依赖项。

入门指南

导入库。

import SettingsAccess

1. 以编程方式打开设置

2. 在 MenuBarExtra 菜单中使用

如果使用基于菜单的 MenuBarExtra,请不要将 openSettingsAccess() 应用于菜单内容。由于 SwiftUI 的限制,openSettingsLegacy() 在那里无法使用。

相反,请使用自定义的 SettingsLink 初始化器来添加一个“设置”菜单项,该菜单项能够在打开 Settings 场景之前和/或之后运行代码。

@main
struct MyApp: App {
    var body: some Scene {
        MenuBarExtra {
            AppMenuView()
                // Do not attach .openSettingsAccess()
        }
        
        Settings { SettingsView() }
    }
}

struct AppMenuView: View {
    var body: some View {
        SettingsLink { 
            Text("Settings...")
        } preAction: {
            // code to run before Settings opens
        } postAction: {
            // code to run after Settings opens
        }
        
        Button("Quit") { NSApp.terminate(nil) }
    }
}

示例代码

尝试 Demo 示例项目,查看库的实际应用。

要求

需要 Xcode 15.0 或更高版本才能构建。

编译后,支持 macOS 11.0 或更高版本。

工作原理(面向极客)

SettingsLink 是一个包装标准 SwiftUI Button 的视图,在 Xcode 16 之前,其操作调用了一个名为 _openSettings 的私有环境方法。(从 Xcode 16 开始,此方法现在公开可用。有关更多信息,请参阅 Xcode 16 更新 部分。)

值得注意的是,由于 SwiftUI Button 的工作方式,不可能附加同时手势来尝试检测按钮按下。

解决方案是使用自定义的 Button 样式,当直接应用于 SettingsLink 时,允许我们捕获 Button 按下操作,并在用户按下按钮之前和之后执行任意代码闭包。我们还可以将此方法导出为名为 openSettingsLegacy 的环境方法,该方法可以在 Apple 公开 openSettings 之前以向后兼容的方式使用。

更多信息和深入探讨可以在 这篇 reddit 帖子 中找到。

作者

由一群穿着外套的 🐹 仓鼠编码,它们自称为 @orchetect

许可证

根据 MIT 许可证获得许可。有关详细信息,请参阅 LICENSE

赞助

如果您喜欢使用 SettingsAccess 并希望在经济上为开源做出贡献,GitHub 赞助将不胜感激。也欢迎反馈和代码贡献。

贡献

欢迎贡献。鼓励在新提交功能或修改的 PR 之前先在 Discussions 中发帖。