2017-06-15 4 views
1

Ok, peut-être je raté quelque chose ici. Je veux utiliser la télécommande noire avec mon application et j'ai obtenu ce code essentiellement de la conférence WWDC 2017 sur le sujet. Il dit ...Obtenir MPRemoteCommandCenter.shared() pour travailler dans tvOS

Un contrôle cohérent et intuitif de la lecture des médias est la clé de nombreuses applications sur tvOS, et l'utilisation et la configuration appropriées de MPNowPlayingInfoCenter et de MPRemoteCommandCenter sont essentielles pour offrir une expérience utilisateur exceptionnelle. Plongez plus profondément dans ces cadres et apprenez à vous assurer une expérience fluide, que votre application soit contrôlée à l'aide de Siri, de la télécommande Siri ou de l'application iOS Remote.

J'ai donc ajouté ces lignes à viewDidLoad de mon application tvOS et bien ils ne font rien fondamentalement?

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 
    } 
    } 

je lance l'application, et essayer le bouton lecture/pause de la télécommande noire et rien est imprimé à la console de débogage? Aussi ajouté du code le plist lié au mode d'arrière-plan ... Est-ce que ce travail ou ai-je manqué le point ici quelque part?

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

Répondre

1

Les commandes MPRemoteCommandCenter ne sont pas déclenchées par la télécommande Siri lorsque votre application est au premier plan. Pour obtenir des événements de la télécommande lorsque vous êtes au premier plan, utilisez UIGestureRecognizer comme vous êtes probablement déjà habitué.

Ces commandes MPRemoteCommandCenter sont d'autres façons dont le système peut vouloir interagir avec la lecture, tels que:

  • Votre application est en cours de lecture audio en arrière-plan, et l'utilisateur appuie sur le bouton de pause sur la télécommande: votre application me demandera d'interrompre la lecture.

  • L'utilisateur utilise la TV application à distance pour iOS et utilise l'écran de contrôle de la lecture de cette application.

+0

Ce pas l'impression que je suis arrivé à regarder la séance WWDC 251, qui dit « un contrôle cohérent et intuitif des médias La lecture est la clé de nombreuses applications sur tvOS, que votre application soit contrôlée à l'aide de Siri, de la télécommande Siri ou de l'application iOS Remote "...? – user3069232

+0

La cohérence est bonne et souhaitable, et pour obtenir cette cohérence, vous devrez implémenter plus d'une API. Le MPRemoteCommandCenter est juste une partie de l'ensemble: c'est spécifiquement pour recevoir des commandes qui ne peuvent pas être capturées par UIGestureRecognizer ou d'autres interactions "normales" dans l'application. Vous voudrez implémenter les deux manières d'accepter les commandes. –

0

Publié la question au support Apple; qui m'a indiqué dans la bonne direction, besoin d'utiliser le contrôleur GCMicroGamepad ou ses frameworks GameKit associés. Que trouvé un exemple 2015 posté par blauzahn qui mérite certainement le crédit vraiment pour ce post. Voici son code légèrement modifié pour 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...") 
     } 
    } 
}