2017-06-15 8 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をいくつか追加しました...これがうまくいけばいいですか?あなたのアプリがフォアグラウンドにあるときMPRemoteCommandCenter

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

答えて

1

コマンドはシリリモートで起動されません。フォアグラウンドにいるときにリモコンからイベントを取得するには、すでに慣れているようなUIGestureRecognizerを使用します。

  • アプリがバックグラウンドでオーディオを再生している、そして、ユーザが一時停止ボタンを押す:MPRemoteCommandCenter

    これらのコマンドは、次のようなシステムがあなたの再生と対話することをお勧めします他の方法、のためのものですリモート:あなたのアプリは再生を一時停止するよう求められます。

  • ユーザーはiOS用のテレビリモートアプリを使用しており、そのアプリの再生制御画面を使用しています。

+0

再生は、あなたのアプリがSiri、Siri Remote、またはiOS Remoteアプリケーションを使って制御されているかどうかにかかわらず、tvOS上の多くのアプリにとって重要です。 – user3069232

+0

一貫性は良好で望ましいです。一貫性を得るには、複数のAPIを実装する必要があります。 MPRemoteCommandCenterは、UIGestureRecognizerや他の「通常の」アプリ内インタラクションではキャプチャできないコマンドを受信するためのものです。コマンドを受け入れる両方の方法を実装したいと思うでしょう。 –

0

アップルサポートに質問を投稿しました。 GCMicroGamepadコントローラまたは関連するGameKitフレームワークを使用する必要があります。 blauzahnが投稿した2015の例が、この投稿のクレジットに最もふさわしいと確信しています。ここで少しスウィフト3.0用に変更彼のコード、IOS 10.xの

import GameController 

が...ある

私はメディアの「一貫性と直感的なコントロールを言うWWDCセッション251を、見てしまったではない印象
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...") 
     } 
    } 
} 
関連する問題