質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1437閲覧

Swift バックグラウンドで自動ロック(スリープ)状態になっても、mp3を再生し続ける方法

torkia

総合スコア24

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2018/11/12 05:13

編集2018/11/19 14:30

バックグラウンド再生を、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("音終了") } } } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自動ロック(スリープ状態)にならなければ、バックグラウンド再生中でも次ページのデータ再生はできていたのですが、スリープ状態になると、次ページを呼び出せても更新(再生メソッドの呼出)ができていないようだったので、「次ページのviewWillAppear」を、次ページの呼出しと同時に行うようにしました。

// 「audioPlayerDidFinishPlaying」のメソッド内にコードを1行追加 if autoPlayNextSetting == 1 { // 全ページ自動再生するなら if index >= soundArray.count { if pageIndex < 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") pvc.contentVCs[nextIndex].viewWillAppear(true) // コードを追加 } else if pageIndex == 19 { print("全ページ音終了") } ・ ・ ・

投稿2018/11/19 14:51

編集2018/11/19 16:18
torkia

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問