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

Swift开发:如何让App非活跃时保持Touch Bar处于活跃状态?

如何在Swift中让App的Touch Bar在其他应用活跃时保持显示

嘿,这个需求我之前折腾过,确实能实现——就像你提到的BetterTouchTool那样。核心思路是绕过系统默认的“仅当前活跃App显示Touch Bar内容”的逻辑,下面分两种场景给你详细讲:

一、使用公开API(无审核风险,需用户配合)

苹果官方允许的合规方式是让用户把你的App的Touch Bar项固定到全局区域,你只需要做好Touch Bar的自定义支持即可:

  1. 给你的自定义Touch Bar设置专属标识符:
class CustomTouchBar: NSTouchBar {
    override init() {
        super.init()
        // 设置自定义标识符,用于系统识别你的Touch Bar项
        self.customizationIdentifier = NSTouchBar.CustomizationIdentifier("com.yourcompany.yourapp.customTouchBar")
        // 默认显示的项
        self.defaultItemIdentifiers = [.customFunctionItem]
        // 允许用户自定义添加的项
        self.customizationAllowedItemIdentifiers = [.customFunctionItem]
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

// 自定义项标识符
extension NSTouchBarItem.Identifier {
    static let customFunctionItem = NSTouchBarItem.Identifier("com.yourcompany.yourapp.customFunctionItem")
}
  1. 在App启动时启用系统的Touch Bar自定义菜单:
NSApplication.shared.isAutomaticCustomizeTouchBarMenuItemEnabled = true

这样用户可以通过View > Customize Touch Bar菜单,把你的App的Touch Bar项拖到Touch Bar最左侧的全局区域——这个区域不管哪个App活跃都会显示。这种方式完全合规,但需要用户手动操作一次。

二、使用私有API(自动实现,有审核风险)

如果你想像BetterTouchTool那样,无需用户操作就能自动在其他App活跃时显示你的Touch Bar内容,就得借助私有API了——注意:这种方式如果要上架Mac App Store肯定会被拒,仅适合自用或非上架的App:

  1. 先监听App的活跃状态变化:
NotificationCenter.default.addObserver(self, selector: #selector(appDidResignActive), name: NSApplication.didResignActiveNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: NSApplication.didBecomeActiveNotification, object: nil)
  1. 在App退到后台时,强制替换系统当前的Touch Bar:
@objc private func appDidResignActive() {
    let customTouchBar = CustomTouchBar()
    // 调用私有API强制设置当前显示的Touch Bar
    NSApplication.shared.perform(Selector(("_overrideTouchBarForApplication:")), with: customTouchBar)
}

@objc private func appDidBecomeActive() {
    // 恢复系统默认的Touch Bar逻辑
    NSApplication.shared.perform(Selector(("_clearOverrideTouchBarForApplication:")), with: nil)
}
  1. 别忘了在Info.plist中添加后台运行权限,确保App在后台也能正常工作:
<key>NSBackgroundModes</key>
<array>
    <string>NSAppKitUIBackgroundMode</string>
</array>

额外注意事项

  • 私有API随时可能被苹果修改,每次macOS系统更新后都需要重新测试兼容性。
  • 公开API的方式虽然需要用户手动操作,但胜在稳定、合规,不会有审核风险。
  • 无论哪种方式,都要确保你的Touch Bar项响应逻辑在后台也能正常执行(比如避免依赖App前台状态的UI操作)。

内容的提问来源于stack exchange,提问作者Gleb Koval

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:11