Как заставить MPRemoteCommandCenter.shared() работать в tvOS

Хорошо, может я что-то здесь упустил. Я хочу использовать черный пульт с моим приложением и получил этот код по существу из выступления на WWDC 2017 по этому вопросу. Это говорит...

Последовательное и интуитивно понятное управление воспроизведением мультимедиа является ключевым для многих приложений в tvOS, а правильное использование и настройка MPNowPlayingInfoCenter и MPRemoteCommandCenter имеют решающее значение для обеспечения отличного пользовательского опыта. Погрузитесь глубже в эти фреймворки и узнайте, как обеспечить бесперебойную работу, независимо от того, управляется ли ваше приложение с помощью Siri, Siri Remote или приложения iOS Remote.

Поэтому я добавил эти строки в viewDidLoad моего приложения tvOS, и они ничего не делают в принципе?

var commandCenter = MPRemoteCommandCenter.shared()

override func viewDidLoad() {
    super.viewDidLoad()

    commandCenter.playCommand.isEnabled = true
    commandCenter.pauseCommand.isEnabled = true

    commandCenter.playCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in
        print("You Pressed play")
        return .success
    }

    commandCenter.pauseCommand.addTarget { (commandEvent) -> MPRemoteCommandHandlerStatus in
        print("You Pressed pause")
        return .success
    }
   }

Я запускаю приложение и пытаюсь нажать кнопку воспроизведения / паузы на черном пульте дистанционного управления, и на консоли отладки ничего не печатается? Также добавлен некоторый код, относящийся к фоновому режиму. Должен ли он работать или я где-то упустил момент?

<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
    <string>external-accessory</string>
</array>

2 ответа

Команды в MPRemoteCommandCenter не запускаются Siri Remote, когда ваше приложение находится на переднем плане. Чтобы получать события с пульта, когда вы находитесь на переднем плане, используйте UIGestureRecognizer как вы, вероятно, уже привыкли.

Эти команды в MPRemoteCommandCenter предназначены для других способов взаимодействия системы с вашим воспроизведением, таких как:

  • Ваше приложение воспроизводит звук в фоновом режиме, и пользователь нажимает кнопку паузы на пульте дистанционного управления: ваше приложение попросят приостановить воспроизведение.

  • Пользователь использует приложение TV Remote для iOS и использует экран управления воспроизведением этого приложения.

Отправил вопрос в службу поддержки Apple; кто указал мне правильное направление, нужно использовать контроллер GCMicroGamepad или связанные с ним платформы GameKit. Затем нашел пример 2015 года, опубликованный Блаузаном, который, безусловно, заслуживает похвалы за этот пост. Вот его код, слегка измененный для Swift 3.0, ios 10.x

import GameController

..

 var gamePad: GCMicroGamepad? = nil

 NotificationCenter.default.addObserver(self,
                                           selector: #selector(gameControllerDidConnect),
                                                     name: NSNotification.Name.GCControllerDidConnect,
                                                     object: nil)

    NotificationCenter.default.addObserver(self,
                                           selector: #selector(gameControllerDidDisconnect),
                                                     name: NSNotification.Name.GCControllerDidDisconnect,  
                                                     object: nil)

func gameControllerDidConnect(notification : NSNotification) {

    if let controller = notification.object as? GCController {

        if let mGPad = controller.microGamepad {

            // Some setup
            gamePad = mGPad
            gamePad!.allowsRotation = true
            gamePad!.reportsAbsoluteDpadValues = true

            print("MicroGamePad connected...")

            // Add valueChangedHandler for each control element
            if gamePad?.buttonA.isPressed == true {
                print("button A pressed")
            }

            if gamePad?.buttonX.isPressed == true {
                print("button X pressed")
            }

            gamePad!.dpad.valueChangedHandler = { (dpad: GCControllerDirectionPad, xValue: Float, yValue: Float) -> Void in

                print("dpad xValue = \(xValue), yValue = \(yValue)")
            }

            gamePad!.buttonA.valueChangedHandler = { (buttonA: GCControllerButtonInput, value:Float, pressed:Bool) -> Void in

                print("\(buttonA)")
            }

            gamePad!.buttonX.valueChangedHandler = { (buttonX: GCControllerButtonInput, value:Float, pressed:Bool) -> Void in

                print("\(buttonX)")
            }
        }
    }
}

// Game controller disconnected
func gameControllerDidDisconnect(notification : NSNotification) {

    if let controller = notification.object as? GCController {

        if  controller.microGamepad != nil {

            self.gamePad = nil
            print("MicroGamePad disconnected...")
        }
    }
}
Другие вопросы по тегам