2015-08-28 81 views
1

从其他文章衍生出来,我成功地为音乐播放器提供了一切。设置MPNowPlayingInfoCenter时,应用程序丢失远程控制输入

最后一步将设置MPNowPlayingInfoCenter值。

不幸的是,只要我这样做,应用程序会失去接收remoteControlEvents的能力,我应该在任何其他View Controller中设置属性。这同样适用于把应用程序在后台从任何其他VC比“音乐VC”(这是一个标签式应用程序和音乐只是其中的一个选项卡)

我的AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    //here is other stuff for push-notifications etc. 

    UIApplication.sharedApplication().beginReceivingRemoteControlEvents() 

    AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil) 

    return true 
} 

MusicVC:

class MusicVC:UIViewController, UITableViewDelegate,UITableViewDataSource,UICollectionViewDataSource, UICollectionViewDelegate { 

    var myPlayer:AVQueuePlayer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //tableView and other setup 

     self.becomeFirstResponder() 

    } 

    //MARK: - InfoCenter Methods 
    func setMediaCenterInfo() { 

     let mpic = MPNowPlayingInfoCenter.defaultCenter() 

     var albumArtWork = MPMediaItemArtwork(image: UIImage(named:"testImage")) 

     var fullString = self.currentSong.title as String 
     var splitArray = fullString.componentsSeparatedByString(" - ") 
     var artistName: String = splitArray[0] 
     var titleString: String? = splitArray.count > 1 ? splitArray[1] : nil 

     if titleString != nil { 

     mpic.nowPlayingInfo = 
      [ 
      MPMediaItemPropertyArtwork:albumArtWork, 
      MPMediaItemPropertyTitle:titleString!, 
      MPMediaItemPropertyArtist:artistName 
      ] 
     } else { 
      mpic.nowPlayingInfo = 
      [ 
      MPMediaItemPropertyArtwork:albumArtWork, 
      MPMediaItemPropertyTitle:fullString 
      ] 
     } 

    //Does get set correctly and shows in Info Center as well as Lock-Screen 

    } 

    override func canBecomeFirstResponder() -> Bool { 
     return true 
    } 

    override func remoteControlReceivedWithEvent(event: UIEvent) { 

     if event.type == UIEventType.RemoteControl { 

      switch event.subtype { 

      case .RemoteControlTogglePlayPause: 
       println("TOGGLE PLAY PAUSE") 
       //self.playToggleTapped(self) 

      case .RemoteControlPlay: 
       println("ONLY PLAY BUTTON") 
       //self.playToggleTapped(self) 

      case .RemoteControlPause: 
       println("ONLY PAUSE BUTTON") 
       //self.playToggleTapped(self) 

      case .RemoteControlNextTrack: 
       println("next") 
       //self.nexButtonTapped(self) 

      case .RemoteControlPreviousTrack: 
       //self.previousButtonTapped(self) 
       println("previous") 

      default: 
       break 
      } 

     } 

    } 

} 

显示另一个VC时FirstResponder是否自动更改?感谢提示,以解决这个问题。

回答

0

如果你仍然有兴趣找到一种方法来做到这一点。

你可以创建一个类来设置你的AudioPlayer与单身。在此AudioPlayer类中,您可以设置MPNowPlayingInfoCenter值和UIApplication.sharedApplication()。beginReceivingRemoteControlEvents()。

然后从'启动'您的播放器的视图控制器和显示在MPNowPlayingInfoCenter值后的所有viewController将继续显示在前景和背景视图。如果您调用'BEFORE'(视图层次结构)视图控制器'audio launching'viewController,则音频将继续播放(前景和背景),但MPNowPlayingInfoCenter中的数据不会显示。

要让它在整个应用程序中传播,您必须在发生“音频启动”时向AppDelegate(NSNotifcation.addObserver ..)发布通知(在您的AudioPlayer中),然后将MPNowPlayingInfoCenter值设置为AppDelegate中的一个函数。我现在正在这样做,所以让我知道你是否仍在寻找解决方案。谢谢

+0

我有这个问题。我可以使用这个工具来处理除WKWebView以外的多个播放源。我已经resignedFirstResponder之前和之后源开始播放和更新nowPlayingInfo没有运气。有任何想法吗? – pir800