从其他一些帖子中,我能够成功地让音乐播放器的一切都变得正确。
最后一步是设置MPNowPlayingInfoCenter值。
不幸的是,一旦我这样做,应用程序失去了接收remoteControlEvents的能力,如果我在任何其他视图控制器中,而不是设置属性的那个。除了“音乐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会自动改变吗?感谢您的提示来解决这个问题。
发布于 2015-12-03 22:39:02
如果你仍然有兴趣找到这样做的方法。
您可以创建一个类来为您的AudioPlayer设置一个单例。在这个AudioPlayer类中,您将设置MPNowPlayingInfoCenter值和UIApplication.sharedApplication().beginReceivingRemoteControlEvents().
然后,从“启动”你的播放器的viewController和在MPNowPlayingInfoCenter之后显示的所有viewController值将继续显示在前台和背景视图中。如果你把“之前”(视图层次)的viewController称为“音频启动”viewController,音频将继续播放(前台和后台),但是来自MPNowPlayingInfoCenter的数据将不会显示。
要让它在整个应用程序中传播,您可能必须(在AudioPlayer中)向AppDelegate(NSNotifcation.addObserver..)发布通知。当“音频启动”发生时,然后在AppDelegate中的函数中设置MPNowPlayingInfoCenter值。我正在做这件事,如果你还在寻找解决方案,请让我知道。谢谢
https://stackoverflow.com/questions/32273730
复制相似问题