Swift-音频后台播放设置及锁屏界面的显示与控制
项目需求: 退出App后音乐继续播放并且可以操控
项目实现:
1.首先选中项目,点击target,按+Capabilities中进行设置,开启background modes(后台模式),勾上Audio,AirPlay,and picture in pucture
2.在Appdelegate里添加头文件,注册后台播放方法
import AVFoundation
// 注册后台播放
let session = AVAudioSession.sharedInstance()
do {
try session.setActive(true)
try session.setCategory(AVAudioSession.Category.playback)
} catch {
print(error)
}
UIApplication.shared.beginReceivingRemoteControlEvents()
3.在要使用的ViewController里添加方法:
viewWillAppear中打开接受远程控制事件
viewWillDisappear中关闭远程控制事件
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
becomeFirstResponder()
UIApplication.shared.beginReceivingRemoteControlEvents()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
resignFirstResponder()
UIApplication.shared.endReceivingRemoteControlEvents()
}
4.在要使用的ViewController里添加锁屏信息方法:
// MARK: 设置锁屏信息显示
func setLockScreenDisplay() {
var info = Dictionary<String, Any>()
info[MPMediaItemPropertyTitle] = model.name//歌名
info[MPMediaItemPropertyArtist] = model.singer//作者
// [info setObject:self.model.filename forKey:MPMediaItemPropertyAlbumTitle];//专辑名
info[MPMediaItemPropertyAlbumArtist] = model.singer//专辑作者
info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(image: UIImage.init(named: model.icon)!)//显示的图片
info[MPMediaItemPropertyPlaybackDuration] = audioPlayer.duration//总时长
info[MPNowPlayingInfoPropertyPlaybackRate] = 1.0//播放速率
MPNowPlayingInfoCenter.default().nowPlayingInfo = info
}
5.在要使用的ViewController里添加锁屏控制方法:
在代码段中case .remoteControlPlay: (写要进行的操作)break,
如果()内不写,直接break,则点击的时候不会有反应
// MARK: 锁屏控制
override func remoteControlReceived(with event: UIEvent?) {
let type = event?.subtype
switch type! {
case .remoteControlPlay: break
//播放
case .remoteControlPause: break
//暂停
case .remoteControlStop: break
//停止
case .remoteControlTogglePlayPause: break
//切换播放暂停(耳机线控)
case .remoteControlNextTrack: break
//下一首
case .remoteControlPreviousTrack: break
//上一首
case .remoteControlBeginSeekingBackward: break
//开始快退
case .remoteControlEndSeekingBackward: break
//结束快退
case .remoteControlBeginSeekingForward: break
//开始快进
case .remoteControlEndSeekingForward: break
//结束快进
default:
break
}
}
我这边是只用到暂停、继续播放、下一首、上一首
在viewcontroller里let 一个player:
//音频播放器
let player = AudioPlayer()
暂停:
case .remoteControlPause: self.player.pause()
break
播放:
case .remoteControlPlay: self.player.resume()
break
在上一首和下一首的时候,用到了当前选中的index,所以new了一个currentRow,然后在进行上一首下一首的时候先进行设置当前播放行:
var currentRow: Int? = 0
func setCurrentRow(type: Int){
let current = self.currentRow ?? 0
switch type {
case 0:
if current < noiseData.count - 1 {
currentRow = current + 1
} else {
currentRow = 0
}
case 1:
if current < 1 {
currentRow = noiseData.count - 1
} else {
currentRow = current - 1
}
default:
break
}
}
//这里是最初选择音乐的时候选中的行通过代理传递过来
func homeNoiseTapCollection(index: Int, value: String) {
player.playMusic(name: value, volume: noiseStyle.volume)
//保存选择的白噪音
self.currentRow = index
homeSelectSection.reloadData(type: 0)
}
下一首:
case .remoteControlNextTrack:
setCurrentRow(type: 0)
self.player.playMusic(name: self.noiseData[self.currentRow ?? 0], volume: self.noiseStyle.volume)
break
上一首:
case .remoteControlPreviousTrack:
setCurrentRow(type: 1)
self.player.playMusic(name: self.noiseData[self.currentRow ?? 0], volume: self.noiseStyle.volume)
简单五步搞定音乐播放器的锁屏,重要的是swift实现哦,赶紧来试试吧,看看效果会心动吗?