
IMG_721B7D8F30BA-1.jpeg
AVPlayer 音乐播放后台播放,以及锁屏主题设置
AppDelegate 类里添加代码
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//开启接收远程事件
application.beginReceivingRemoteControlEvents()
/// 结束远程事件
// UIApplication.shared.endReceivingRemoteControlEvents()
return true
}
接受远程控制的按钮切换
/// 接受远程控制的按钮切换
override func remoteControlReceived(with event: UIEvent?) {
if event?.type == UIEvent.EventType.remoteControl {
switch event?.subtype {
case .remoteControlPause:
PlayerManager.shared.playerPause()
case .remoteControlPlay:
//播放
PlayerManager.shared.playerPlay()
case .remoteControlPreviousTrack:
//前一首
PlayerManager.shared.playPrevious()
case .remoteControlNextTrack:
//下一首
PlayerManager.shared.playNext()
default:
break
}
PlayerManager.shared.updateLockedScreenMusic()
}
}
创建PlayerManager 单利类管理播放器AVPlayer
import MediaPlayer
import AVKit
import UIKit
class PlayerManager: NSObject {
//歌曲加载状态
enum MusicLoadStatus {
case none //默认
case loadding //加载中
case readyToPlay //准备播放
case completed //播放完成
case failed //播放失败
}
//歌词加载状态
enum LrcLoadStatus {
case none //默认
case loadding //加载中
case completed //完成
case failed //失败
}
//歌曲播放模式
enum PlayerCycle: Int {
/**单曲循环*/
case single = 0
/**顺序播放*/
case order = 1
/**随机播放*/
case random = 2
}
static let shared = PlayerManager()
/*播放器*/
var player:AVPlayer = AVPlayer.init()
var session = AVAudioSession.sharedInstance()
override init() {
super.init()
// --- 支持后台播放 plist 配置对应的key
// <key>UIBackgroundModes</key>
// <array>
// <string>audio</string>
// </array>
try? session.setCategory(.playback)
try? session.setActive(true, options: [])
// //播放完毕的通知
// NotificationCenter.addObserver(observer: self, selector: #selector(playerItemDidPlayToEndTime(_:)), name: Notification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)
// //耳机插入和拔掉通知
// NotificationCenter.addObserver(observer: self, selector: #selector(audioRouteChangeListener(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
}
/// 网络或者本地路径
func play(url:String) {
var itemUrl:URL?
if url.hasPrefix("http") {
itemUrl = URL.init(string: "url")
}else{
itemUrl = URL.init(fileURLWithPath: url)
}
if let l = itemUrl {
let item = AVPlayerItem.init(url: l)
self.player.replaceCurrentItem(with: item )
self.player.play()
}
}
/// 暂停
func playerPause() {
}
/// 播放
func playerPlay() {
}
/// 前一首
func playPrevious() {
}
/// 下一首
func playNext() {
}
/// 更新锁屏的音乐名字和字幕
func updateLockedScreenMusic() {
}
/// 锁屏主题设置
func configNowPlayingCenter() {
var info:[String:Any] = [:];
//音乐的标题
info[MPMediaItemPropertyTitle] =
"折子戏";
//音乐的艺术家
let author = "黄忠";
info[MPMediaItemPropertyArtist] =
author;
// 当前播放的进度
info[MPNowPlayingInfoPropertyElapsedPlaybackTime] =
10;
//音乐的播放速度
info[MPNowPlayingInfoPropertyPlaybackRate] =
1;
//音乐的总时间
info[MPMediaItemPropertyPlaybackDuration] =
100;
//音乐的封面
let artwork = MPMediaItemArtwork.init(boundsSize: CGSize.init(width: 200, height: 200)) { (size) -> UIImage in
return UIImage.init(named: "12.jpg")!
};
info[MPMediaItemPropertyArtwork] =
artwork;
//完成设置
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
}
}
其中允许后台播放的这句代码很关键
// --- 支持后台播放 plist 配置对应的key
// <key>UIBackgroundModes</key>
// <array>
// <string>audio</string>
// </array>
try? session.setCategory(.playback)
try? session.setActive(true, options: [])
锁屏主题设置
/// 锁屏主题设置
func configNowPlayingCenter() {
var info:[String:Any] = [:];
//音乐的标题
info[MPMediaItemPropertyTitle] =
"折子戏";
//音乐的艺术家
let author = "黄忠";
info[MPMediaItemPropertyArtist] =
author;
// 当前播放的进度
info[MPNowPlayingInfoPropertyElapsedPlaybackTime] =
10;
//音乐的播放速度
info[MPNowPlayingInfoPropertyPlaybackRate] =
1;
//音乐的总时间
info[MPMediaItemPropertyPlaybackDuration] =
100;
//音乐的封面
let artwork = MPMediaItemArtwork.init(boundsSize: CGSize.init(width: 200, height: 200)) { (size) -> UIImage in
return UIImage.init(named: "12.jpg")!
};
info[MPMediaItemPropertyArtwork] =
artwork;
//完成设置
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
}
网友评论