2017-06-15 54 views
1

好吧,也許我錯過了這裏的東西。我想用我的應用程序使用黑色遙控器,並基本從WWDC 2017談話中獲得此代碼。它說...讓MPRemoteCommandCenter.shared()在tvOS中工作

一致和直觀的媒體播放控制是許多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> 

回答

1

當您的應用處於前臺時,Siri Remote不會觸發MPRemoteCommandCenter中的命令。當您處於前臺時,要從遙控器獲取事件,請使用UIGestureRecognizer,就像您可能已經習慣的那樣。

MPRemoteCommandCenter這些命令的其他方式的系統可能要與您的播放互動,如:

  • 您的應用播放音頻在後臺,並且用戶按下暫停按鈕在遙控器上:我的應用程序會被要求暫停播放。

  • 用戶正在使用iOS的TV Remote應用程序,並且正在使用該應用程序的播放控制屏幕。

+0

這不是我的印象得到了看WWDC會議251,它說「的媒體一致的和直觀的控制播放是tvOS上許多應用程序的關鍵,無論您的應用程序是使用Siri,Siri Remote還是iOS Remote應用程序進行控制「...? – user3069232

+0

一致性是好的和可取的,獲得這種一致性需要你實現多個API。 MPRemoteCommandCenter只是整體的一部分:它專門用於接收UIGestureRecognizer無法捕獲的命令或其他「正常」的應用內交互。你會想要實現接受命令的兩種方式。 –

0

將問題發佈到Apple支持;誰指出我在正確的方向,需要使用GCMicroGamepad控制器或其相關的GameKit框架。比找到了由blauzahn發佈的2015年例子,這個職位絕對值得信任。這裏是他的代碼稍加修改雨燕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...") 
     } 
    } 
}