Как заставить 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...")
}
}
}