1

他のいくつかの投稿から派生したもので、音楽プレーヤーにすべてを正しくすることができました。

最後のステップは、MPNowPlayingInfoCenter値を設定することです。

残念ながら、これを行うとすぐに、プロパティを設定したビュー コントローラー以外のビュー コントローラーにいる場合、アプリは remoteControlEvents を受信する機能を失います。「Music VC」以外の VC からアプリをバックグラウンドに配置する場合も同様です (これはタブ付きのアプリケーションであり、Music は 1 つのタブにすぎません)。

私の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 は自動的に変更されますか? これを修正するためのヒントに感謝します。

4

1 に答える 1

0

これを行う方法を見つけることにまだ興味がある場合。

シングルトンで AudioPlayer をセットアップするクラスを作成できます。この AudioPlayer クラス内で、MPNowPlayingInfoCenter 値と UIApplication.sharedApplication().beginRecomingRemoteControlEvents() を設定します。

次に、プレーヤーを「起動」したviewControllerと、MPNowPlayingInfoCenter値の後に表示されるすべてのviewControllerが、フォアグラウンドビューとバックグラウンドビューに引き続き表示されます。「BEFORE」(ビュー階層) の viewController を「オーディオ起動」viewController と呼ぶと、オーディオは引き続き再生されます (フォアグラウンドとバックグラウンド) が、MPNowPlayingInfoCenter からのデータは表示されません。

アプリ全体に伝播させるには、おそらく、「オーディオの起動」が発生したときに (AudioPlayer 内で) 通知を AppDelegate(NSNotifcation.addObserver..) に投稿し、関数内の MPNowPlayingInfoCenter 値を設定する必要があります。 AppDelegate。現在これを行っているので、まだ解決策を探している場合はお知らせください。ありがとう

于 2015-12-03T14:39:02.310 に答える