way*_*neh 7 mpmusicplayercontroller ios11
我有一个使用MPMusicPlayerController的音乐应用程序.
我最初使用iOS 9下的systemMusicPlayer选项编写了它.我遇到了一些问题,播放器在某些情况下没有正确关闭所以我切换到appplicationMusicPlayer(请参阅 退出应用程序导致错误"来自调试器的消息:由于信号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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |