Swift开发:如何让App非活跃时保持Touch Bar处于活跃状态?
如何在Swift中让App的Touch Bar在其他应用活跃时保持显示
嘿,这个需求我之前折腾过,确实能实现——就像你提到的BetterTouchTool那样。核心思路是绕过系统默认的“仅当前活跃App显示Touch Bar内容”的逻辑,下面分两种场景给你详细讲:
一、使用公开API(无审核风险,需用户配合)
苹果官方允许的合规方式是让用户把你的App的Touch Bar项固定到全局区域,你只需要做好Touch Bar的自定义支持即可:
- 给你的自定义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") }
- 在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:
- 先监听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)
- 在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) }
- 别忘了在
Info.plist中添加后台运行权限,确保App在后台也能正常工作:
<key>NSBackgroundModes</key> <array> <string>NSAppKitUIBackgroundMode</string> </array>
额外注意事项
- 私有API随时可能被苹果修改,每次macOS系统更新后都需要重新测试兼容性。
- 公开API的方式虽然需要用户手动操作,但胜在稳定、合规,不会有审核风险。
- 无论哪种方式,都要确保你的Touch Bar项响应逻辑在后台也能正常执行(比如避免依赖App前台状态的UI操作)。
内容的提问来源于stack exchange,提问作者Gleb Koval
相关产品推荐
相关产品推荐

