【问题标题】:App loses remote Control Inputs when setting MPNowPlayingInfoCenter设置 MPNowPlayingInfoCenter 时应用程序丢失远程控制输入
【发布时间】:2015-08-28 14:45:43
【问题描述】:

来自其他一些帖子,我成功地为音乐播放器做好了一切。

最后一步是设置 MPNowPlayingInfoCenter 值。

不幸的是,一旦我这样做了,如果我在设置属性的视图控制器之外的任何其他视图控制器中,应用程序将失去接收 remoteControlEvents 的能力。将应用程序置于“音乐 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
}

音乐风投:

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 是否会自动更改?感谢您提供解决此问题的提示。

【问题讨论】:

    标签: swift avplayer mpnowplayinginfocenter


    【解决方案1】:

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

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

    然后从“启动”你的播放器的 viewController 和所有在 MPNowPlayingInfoCenter 值之后显示的 viewController 将继续显示在前景和背景视图中。如果您将“之前”(视图层次结构)的视图控制器称为“音频启动”视图控制器,则音频将继续播放(前景和背景),但您来自 MPNowPlayingInfoCenter 的数据将不会显示。

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

    【讨论】:

    • 我遇到了这个问题。除了 WKWebView 之外,我可以让它与多个播放源一起工作。在源开始播放之前和之后,我已经辞职了FirstResponder,并且没有运气更新 nowPlayingInfo。有什么想法吗?
    猜你喜欢
    • 2016-03-01
    • 1970-01-01
    • 2011-09-19
    • 2016-10-22
    • 2019-02-23
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多