1

好吧,也许我在这里错过了一些东西。我想在我的应用程序中使用黑色遥控器,并且基本上从 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
    }
   }

我运行应用程序,然后尝试黑色遥控器上的播放/暂停按钮,调试控制台上没有打印任何内容?还添加了一些与后台模式相关的 plist 代码......这应该工作还是我错过了这里的某个地方?

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

2 回答 2

1

MPRemoteCommandCenter当您的应用程序在前台时,Siri Remote 不会触发其中的命令。当您在前台时,要从远程获取事件,请UIGestureRecognizer像您可能已经习惯的那样使用。

这些命令MPRemoteCommandCenter用于系统可能希望与您的播放交互的其他方式,例如:

  • 您的应用正在后台播放音频,用户按下遥控器上的暂停按钮:您的应用将被要求暂停播放。

  • 用户正在使用适用于 iOS 的 TV Remote 应用程序,并且正在使用该应用程序的播放控制屏幕。

于 2017-06-15T15:59:54.113 回答
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...")
        }
    }
}
于 2017-06-24T09:52:08.720 回答