SwiftUIでコントロールセンターのシークバーで音声ファイルの再生位置を制御する方法を説明する。
Swift 5.7 / Xcode 14.0 / iOS 16.0
結論
MPNowPlayingInfoCenter に以下を設定する。
- MPNowPlayingInfoPropertyElapsedPlaybackTime(音声ファイルの現在の再生位置)
- MPMediaItemPropertyPlaybackDuration(音声ファイルの長さ)
MPRemoteCommandCenter に以下を設定する。
- changePlaybackPositionCommand(シークバー)
具体例
コントロールセンターのシークバーで音声ファイルの再生位置を制御できるAppを作成する。
App起動時の画面
ボタンをタップすると音声が再生される。コントロールセンターを表示させるとシークバーで音声ファイルの再生位置を制御できる。
コード
こちらの記事のコードをベースに以下のコードを追加する。
- MPNowPlayingInfoPropertyElapsedPlaybackTime(音声ファイルの現在の再生位置)
- MPMediaItemPropertyPlaybackDuration(音声ファイルの長さ)
- changePlaybackPositionCommand(シークバー)
import SwiftUI
import AVFoundation
import MediaPlayer
struct ContentView: View {
var body: some View {
let プレイヤークラス = playerClass()
Button("音声を再生") {
プレイヤークラス.プレイヤー.play()
}
.buttonStyle(.borderedProminent)
}
}
class playerClass {
var プレイヤー: AVAudioPlayer
init() {
let ファイルURL = Bundle.main.url(forResource: "sample",
withExtension: "mp3")!
プレイヤー = try! AVAudioPlayer(contentsOf: ファイルURL)
setNowPlayingInfo()
setMPRemoteCommandCenter()
}
func setNowPlayingInfo() {
var nowPlayingInfo = [String : Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = "タイトル"
nowPlayingInfo[MPMediaItemPropertyAlbumTitle] = "アルバム"
// ? 1
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = プレイヤー.currentTime
// ? 2
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = プレイヤー.duration
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = プレイヤー.rate
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
func setMPRemoteCommandCenter() {
// Get the shared command center.
let commandCenter = MPRemoteCommandCenter.shared()
// 再生/停止/次に進む/前に戻るコマンド
commandCenter.playCommand.addTarget { [unowned self] event in
print("play")
プレイヤー.play()
return .success
}
commandCenter.pauseCommand.addTarget { [unowned self] event in
print("pause")
プレイヤー.pause()
return .success
}
commandCenter.nextTrackCommand.addTarget{ [unowned self] event in
print("next")
// ここに次の曲に進む処理を記述
return .success
}
commandCenter.previousTrackCommand.addTarget{ [unowned self] event in
print("previous")
// ここに前の曲に戻る処理を記述
return .success
}
// ? 3
commandCenter.changePlaybackPositionCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
if let changePlaybackPositionCommandEvent = event as? MPChangePlaybackPositionCommandEvent
{
let positionTime = changePlaybackPositionCommandEvent.positionTime
self.プレイヤー.currentTime = positionTime
}
return .success
}
}
}
まとめ
SwiftUIでコントロールセンターのシークバーで音声ファイルの再生位置を制御する方法を説明した。
コメント