首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序在设置MPNowPlayingInfoCenter时丢失远程控制输入

应用程序在设置MPNowPlayingInfoCenter时丢失远程控制输入
EN

Stack Overflow用户
提问于 2015-08-28 22:45:44
回答 1查看 494关注 0票数 1

从其他一些帖子中,我能够成功地让音乐播放器的一切都变得正确。

最后一步是设置MPNowPlayingInfoCenter值。

不幸的是,一旦我这样做,应用程序失去了接收remoteControlEvents的能力,如果我在任何其他视图控制器中,而不是设置属性的那个。除了“音乐VC”之外,将应用程序放在后台也是如此(它是一个选项卡应用程序,而音乐只是一个选项卡)

我的AppDelegate:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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会自动改变吗?感谢您的提示来解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2015-12-03 22:39:02

如果你仍然有兴趣找到这样做的方法。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32273730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档