我有一个使用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,重新编译,确定 - 用户界面处于正常速度。
所以现在我处于一个糟糕的位置 - 使用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")
}
}
}
答案 0 :(得分:1)
一旦开始播放,该应用似乎会锁定,但如果您向上滑动以显示控制中心然后将其关闭,应用就会立即开始正常工作。
答案 1 :(得分:0)
我遇到了同样的问题。我认为API有问题。对于大型查询,它特别慢。但你可以在夸脱上加上一个谓词,这样就不会有云音乐。
答案 2 :(得分:0)
对于将来浏览此主题的任何人来说,这是iOS 11.2所有版本中的已知错误。它影响了任何使用systemMusicPlayer的人。
Apple确实喜欢劝阻我们的第三方音乐应用开发者,嗯? ;)无论我的阴谋理论是什么(我确定你也有你的阴谋理论),这个错误在iOS 11.3中得到修复。
我们在iOS 11.2上向用户发出有关该错误的警告,并建议他们升级到iOS 11.3以获得(或多或少)无滞后的体验。
答案 3 :(得分:0)
我今天遇到了这个问题-工作代码刚刚停止正确运行,但是我发现了(部分)解决方法:
\\Do anything that updates (like changing the song title in the UI) in the selector called by this notification
NotificationCenter.default.addObserver(self, selector: #selector(remoteMusicChange), name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)
问题在于,不再(总是)立即发生调用“ systemMusicPlayer的下一曲”的呼叫。如果等待通知,至少可以确定systemMusicPlayer已更新。
问题在于,有时该通知可能要花很长时间才能触发(有时是即时的)。
编辑:https://forums.developer.apple.com/thread/96287我猜想这与这些问题有关
EDIT2:在iOS12中快速测试了另一个相关问题,该问题不再存在(更改播放速度),并且更改歌曲时的暂停消失了。