好的,也许我在这里错过了什么。我想在我的应用程序中使用黑色遥控器,并且从WWDC 2017谈论这个问题得到了这个代码。它说......
媒体播放的一致和直观控制是tvOS上许多应用的关键,正确使用和配置MPNowPlayingInfoCenter和MPRemoteCommandCenter对于提供出色的用户体验至关重要。深入了解这些框架,并了解如何确保使用Siri,Siri Remote或iOS Remote应用程序来控制应用程序的无缝体验。
所以我将这些行添加到我的 tvOS 应用的viewDidLoad
中,他们基本上什么也没做?
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
}
}
我运行应用程序,并尝试黑色遥控器上的播放/暂停按钮,没有任何内容打印到调试控制台?还添加了与背景模式相关的plist的一些代码......这应该工作还是我在某处错过了这一点?
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>external-accessory</string>
</array>
答案 0 :(得分:1)
当您的应用位于前台时,Siri Remote不会触发MPRemoteCommandCenter
中的命令。要在您处于前台时从遥控器获取活动,请使用您可能已经习惯的UIGestureRecognizer
。
MPRemoteCommandCenter
中的这些命令用于系统可能想要与您的播放进行交互的其他方式,例如:
您的应用正在后台播放音频 ,用户按下遥控器上的暂停按钮:您的应用我将被要求暂停播放。
用户正在使用适用于iOS的电视远程应用,并正在使用该应用的播放控制屏幕。
答案 1 :(得分:0)
将问题发布给Apple支持;谁指出我正确的方向,需要使用GCMicroGamepad控制器或其相关的GameKit框架。比发现了一个由blauzahn发布的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...")
}
}
}