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

疑Apple GCController.shouldMonitorBackgroundEvents功能失效,求排查

macOS 后台无法监听游戏控制器输入问题

我设置了GCController.shouldMonitorBackgroundEvents = true,但应用在后台时仍然无法获取游戏控制器的输入。苹果官方文档对该属性的说明是:

一个布尔值,指示应用在非前台状态下是否需要响应控制器事件。

当前现象:应用处于前台时能正常识别控制器输入,切换到后台后就无法识别,但控制器并未断开连接。我确认大约两个月前这个功能是正常工作的,而且近期一款同类功能的应用也出现了同样的失效情况,这让我更怀疑是该功能本身出了问题。

最小复现代码

import SwiftUI
import GameController

@main
struct TestingControllerConnectionApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, NSApplicationDelegate {
    var statusItem: NSStatusItem?
    var controller: GCController?
    
    func applicationDidFinishLaunching(_ notification: Notification) {
        setupMenuBar()
        
        GCController.shouldMonitorBackgroundEvents = true
        
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(controllerDidConnect),
            name: .GCControllerDidConnect,
            object: nil
        )
        
        NotificationCenter.default.addObserver(
            self,
            selector: #selector(controllerDidDisconnect),
            name: .GCControllerDidDisconnect,
            object: nil
        )
    }
    
    @objc private func setupMenuBar() {
        let menu = NSMenu()

        menu.addItem(NSMenuItem(title: "Quit", action: #selector(quitApp), keyEquivalent: "q"))
        
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        statusItem?.button?.image = NSImage(resource: .controllerBar)
        statusItem?.menu = menu
    }
    
    @objc private func quitApp() {
        NSApp.terminate(nil)
    }
    
    @objc private func controllerDidConnect(_ notification: Notification) {
        if let controller = notification.object as? GCController {
            print("Controller connected")
            
            self.controller = controller
            
            if let gamepad = controller.extendedGamepad {
                gamepad.buttonA.pressedChangedHandler = { _, _, pressed in
                    print("Button A pressed: \(pressed)")
                }
            }
        }
    }

    @objc private func controllerDidDisconnect(_ notification: Notification) {
        print("Controller disconnected")
    }
}

测试环境

  • macOS 15.4.1
  • PS5 控制器
  • 代码基于全新Xcode项目创建,已添加NSHumanInterfaceDeviceUsageDescription权限,测试时仅打开Xcode和该应用

已尝试的解决方案

  • 添加权限:com.apple.security.device.bluetooth、com.apple.security.device.usb和com.apple.security.device.hid
  • 在代码不同位置设置GCController.shouldMonitorBackgroundEvents = true
  • 在应用Capabilities标签中添加「Game Controllers」功能

请问是我的代码或对该属性的理解有误,还是苹果的这个功能确实出现了损坏?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:28:17