ios11 – MPMusicPlayerController在systemMusicPlayer时响应速度慢,应用程序时速度快

我有一个使用MPMusicPlayerController的音乐应用程序.

我最初使用iOS 9下的systemMusicPlayer选项编写它.
我在播放器在某些情况下没有正确关闭时遇到了一些麻烦所以我切换到了appplicationMusicPlayer
(见Quitting app causes error “Message from debugger: Terminated due to signal 9”)

但是,作为一个应用程序播放器,我无法获得很多好处,如控制中心处理,蓝牙数据显示等.

所以,我切换回systemMusicPlayer.
我还改为Xcode 9.2和iOS 10.3的编译目标.

现在,当我运行我的应用程序时,它可能需要几秒钟才能响应播放/暂停或下一个/上一个等控件.我的整个用户界面痛苦地反应迟钝.

我尝试切换回applicationMusicPlayer,重新编译,确定 – UI处于正常速度.

所以现在我处于一个糟糕的位置 – 使用systemMusicPlayer,该应用程序几乎无法使用,但是使用applicationMusicPlayer我失去了很多功能.

这似乎与我的iPhone上的iOS 11.2.2直接相关,或者与iOS 10.3的目标有关

有没有人知道发生了什么以及如何解决它

编辑:
我创建了一个非常基本的播放器,它似乎在任何一种模式下都能正常工作,所以现在我很困惑 – 我将测试其他MP命令,看看是什么
问题是,因为即使我的UI减慢,我也不确定.

编辑2:
我相信我发现罪魁祸首是NotificationCenter,并且还从MPMusicPlayerController获取状态.我已经更新了下面显示问题的示例代码.一旦运行,单击“下一步”按钮有时会很慢,但单击“上一步”可能会导致延迟最多两秒!

如果您想创建一个简单的播放器,这是基本代码.
务必在故事板中添加三个按钮并相应地连接它们.

//
//  ViewController.swift
//  junkplayer
//

import UIKit
import MediaPlayer

let notificationCenter = NotificationCenter.default

let myMP:MPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer
//let myMP:MPMusicPlayerController = MPMusicPlayerController.applicationMusicPlayer()

class ViewController: UIViewController {
    @IBOutlet weak var xxx: UIButton!
    @IBOutlet weak var nextbut: UIButton!
    @IBOutlet weak var prevbut: UIButton!
    var qrySongs = MPMediaQuery()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myMP.repeatMode = MPMusicRepeatMode.none
        myMP.shuffleMode = MPMusicShuffleMode.off
        myMP.prepareToPlay()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        stopMPNotifications()
        startMPNotifications()
    }

    @IBAction func nextbut(_ sender: Any) {
        myMP.skipToNextItem()
    }
    @IBAction func prevbut(_ sender: Any) {
        myMP.skipToPreviousItem()
    }
    @IBAction func playbut(_ sender: UIButton) {
        qrySongs = MPMediaQuery.songs()
        myMP.setQueue(with: qrySongs)

        myMP.play()
    }
    func startMPNotifications(){
        notificationCenter.addObserver(self, selector: #selector(showNowPlaying), name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: myMP)
        notificationCenter.addObserver(self, selector: #selector(handlePlayState), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: myMP)
        myMP.beginGeneratingPlaybackNotifications()
    }
    func stopMPNotifications(){
        notificationCenter.removeObserver(self, name: .MPMusicPlayerControllerPlaybackStateDidChange, object: myMP)
        notificationCenter.removeObserver(self, name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: myMP)
        myMP.endGeneratingPlaybackNotifications()
    }
    @objc func handlePlayState(){
        if myMP.playbackState == .playing {
            print("handlePlayState playback state = playing")
        }else{
            print("handlePlayState playback state NOT playing")
        }
        print("handlePlayState going to shownowplaying")
        showNowPlaying()
    }
    @objc func showNowPlaying(){
        if myMP.nowPlayingItem != nil {
            print("shownowplaying nowplaying not null")
        }
    }
}
最佳答案
一旦你开始玩,该应用程序似乎锁定,但如果你向上滑动显示控制中心然后关闭它,应用程序立即开始正常工作.

转载注明原文:ios11 – MPMusicPlayerController在systemMusicPlayer时响应速度慢,应用程序时速度快 - 代码日志