IOS開発は初めてなので、ここに行きます。オーディオを再生しているアプリがあります-AVAudioPlayer
を使用して、アプリのアセットに名前で単一のファイルを読み込みます。ユーザーのライブラリを照会したくはありません。提供されたファイルのみを照会します。うまく機能しますが、ユーザーがロック画面から一時停止して音量を調整できるようにします。
func initAudioPlayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
audioPlayer.volume = slider.value
audioPlayer.numberOfLoops = -1
audioPlayer.prepareToPlay()
if(audioShouldPlay){
audioPlayer.play()
// let mpic = MPNowPlayingInfoCenter.defaultCenter()
// mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title", MPMediaItemPropertyArtist:"artist"]
}
}
catch{}
}
AVAudioSession
とMPNowPlayingInfoCenter
の私の使用は、他の関連する投稿を読んでからの単なる実験でした。
アプリのplistファイルでオーディオのバックグラウンドモードが有効になっている
BeginReceivingRemoteControlEvents()を呼び出す必要があります。呼び出さないと、実際のデバイスでは機能しません。
Swift 3.1
UIApplication.shared.beginReceivingRemoteControlEvents()
MPRemoteCommandCenterのカスタムアクションを指定する場合:
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget(self, action:#selector(nextTrackCommandSelector))
func myplayer(file:String, type:String){
let path = NSBundle.mainBundle().pathForResource(file, ofType: type)!
let url = NSURL(fileURLWithPath: path)
let audioShouldPlay = audioPlaying()
do{
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
let audioPlayer:AVAudioPlayer = try AVAudioPlayer(contentsOfURL: url)
audioPlayer.volume = slider.value
audioPlayer.numberOfLoops = -1
audioPlayer.prepareToPlay()
if(audioShouldPlay){
audioPlayer.play()
// let mpic = MPNowPlayingInfoCenter.defaultCenter()
// mpic.nowPlayingInfo = [MPMediaItemPropertyTitle:"title",
MPMediaItemPropertyArtist:"artist"]
}
}
catch{}
}
ロック画面には既にオーディオコントロールがあります(「リモートコントロール」インターフェイス)。アプリのオーディオを制御したい場合は、 Appleのドキュメント で説明されているように、アプリをリモートコントロールターゲットにする必要があります。
この問題があります。あなただけが必要です
audioSession.setCategory(.playback, mode: .default) or
audioSession.setCategory(.playback, mode: .default, options:
.init(rawValue: 0))
この機能を実装するには、Media Playerフレームワークの MPRemoteCommandCenter および MPNowPlayingInfoCenter のクラスと AVPlayer を使用します。
import MediaPlayer
import AVFoundation
// Configure AVPlayer
var player = AVPlayer()
リモートコマンドハンドラーを構成する
カスタムイベントハンドラーをアタッチしてアプリの再生を制御できるMPRemoteCommandオブジェクトの形式でさまざまなコマンドを定義します。
func setupRemoteTransportControls() {
// Get the shared MPRemoteCommandCenter
let commandCenter = MPRemoteCommandCenter.shared()
// Add handler for Play Command
commandCenter.playCommand.addTarget { [unowned self] event in
if self.player.rate == 0.0 {
self.player.play()
return .success
}
return .commandFailed
}
// Add handler for Pause Command
commandCenter.pauseCommand.addTarget { [unowned self] event in
if self.player.rate == 1.0 {
self.player.pause()
return .success
}
return .commandFailed
}
}
ディスプレイメタデータの提供
MPMediaItemおよびMPNowPlayingInfoCenterによって定義されたキーを使用してメタデータの辞書を提供し、MPNowPlayingInfoCenterのデフォルトインスタンスにその辞書を設定します。
func setupNowPlaying() {
// Define Now Playing Info
var nowPlayingInfo = [String : Any]()
nowPlayingInfo[MPMediaItemPropertyTitle] = "My Movie"
if let image = UIImage(named: "lockscreen") {
nowPlayingInfo[MPMediaItemPropertyArtwork] =
MPMediaItemArtwork(boundsSize: image.size) { size in
return image
}
}
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = playerItem.currentTime().seconds
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = playerItem.asset.duration.seconds
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate
// Set the metadata
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
}
詳細については、Appleの公式を参照してください Documentation