バックグラウンド再生を、iPhoneのロック状態(スリープ)になっても継続させたいのですが、うまくいきません。
解る方がいらっしゃいましたら教えて頂けると助かります。宜しくお願い致します。
仕様
各mp3を割り当てたボタンをタップしたら、AVAudioPlayerでmp3データを再生させています。
各ページにmp3は10コ〜30コほど割り当てています
自動再生するように設定すると、AVAudioPlayerDelegateの[audioPlayerDidFinishPlaying] メソッドで再生終了したら次のmp3を再生するように条件分岐させ、連続で再生し続け、そのページの最後のmp3を再生すると、次ページの頭から自動再生するようにしています。
試したこと
バックグラウンド再生させるために、以下のコードをmp3を再生させるメソッド内の audioPlayer.play()の手前で記述。
try?AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback,
with: .mixWithOthers)
try? AVAudioSession.sharedInstance().setActive(true)
(「capabilities」で「Background Modes」をONにして、「Audio,AirPlay, and Picture in Picture」にチェック済み)
できていること・できないこと
アプリをバックグラウンドにした時点では、再生は継続されているのですが、自動ロック(スリープ状態)に入ると、スリープ状態に入ったときのページのデータ分が再生し終えたら、次ページにいかず、終了してしまいます。
どうやら、スリープ状態にならなければ、バックグラウンド再生は継続されるみたいなのですが、スリープ状態でも再生を継続させたいです。
import UIKit import AVFoundation class PageContentViewController: UIViewController, UIScrollViewDelegate, AVAudioPlayerDelegate { (略) override func viewDidLoad() { super.viewDidLoad() (略) soundArray = csvSoundArray[pageIndex].components(separatedBy: ";") soundArray = soundArray.filter {$0 != ""} for index in 0..<soundArray.count { ・ ・ soundButton.tag = index // ボタン識別用ID soundButton.addTarget(self, action: #selector(buttonEventSound(sender:)), for: .touchDown) soundButtons.append(soundButton) scrollView.addSubview(soundButton) } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) backgroundSetting = userDefaults.integer(forKey: "backgroundSetting") autoPlaySetting = userDefaults.integer(forKey: "autoPlaySetting") autoPlayNextSetting = userDefaults.integer(forKey: "autoPlayNextSetting") autoPlayNext = userDefaults.integer(forKey: "autoPlayNext") ・ ・ // 自動連続再生 if autoPlayNext == 1 { if autoPlaySetting == 1 { let index = 0 soundPlay(index: index) // mp3再生メソッド呼出し userDefaults.set(0, forKey: "autoPlayNext") } } } // ボタンタップイベント func buttonEventSound(sender: UIButton) { let index = sender.tag soundPlay(index: index) } // mp3再生メソッド func soundPlay(index: Int) { let audioPath = Bundle.main.path(forResource: "(soundArray[index])", ofType:"mp3")! let audioUrl = URL(fileURLWithPath: audioPath) do { audioPlayer = try AVAudioPlayer(contentsOf: audioUrl) audioPlayer.delegate = self // バックグラウンド再生 try?AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers) try? AVAudioSession.sharedInstance().setActive(true) audioPlayer.prepareToPlay() audioPlayer.enableRate = true audioPlayer.rate = soundRate } catch { print("エラー") } (略) audioPlayer.play() currentPlayer = audioPlayer currentButtonIndex = index } // 音楽再生が成功した時に呼ばれるメソッド func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) { currentPlayer = nil if autoPlaySetting == 1 { // 自動再生するとき let index = currentButtonIndex! + 1 if index < soundArray.count { soundPlay(index: index) if autoPlayScrollSetting == 1 { // 自動スクロールするとき (略) } if autoPlayNextSetting == 1 { // 全ページ自動再生するなら if index >= soundArray.count { // 最後のボタンの再生が終わったら if pageIndex < 19 { // 19までは次ページも自動連続再生する let pvc = self.parent as! PageViewController let nextIndex = pageIndex + 1 pvc.setViewControllers([pvc.contentVCs[nextIndex]], direction: .forward, animated: true, completion: nil) pvc.currentIndex += 1 autoPlayNext = 1 // 次ページも自動再生させる userDefaults.set(autoPlayNext, forKey: "autoPlayNext") } else if pageIndex == 19 { print("音終了") } } } } }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。