SoundCloud API を使用してストリーミング オーディオ アプリを構築しています。4 つのビュー コントローラーがあり、4 番目のビュー コントローラーは現在再生中のトラック VC です。これは、ミュージック アプリの現在再生中のシーンに似ています。
アプリがフォアグラウンドにある場合、すべて問題なく、次のオーディオ トラックが正しく再生されます。アプリがバックグラウンドに移動すると、現在のトラックが再生され続けますが、終了するとすぐに、アプリをフォアグラウンドに戻すまで次のトラックが再生されません。iOS のバックグラウンド オーディオが再生されないなどの既存の問題を多数確認しましたが、提案された解決策はどれも機能しません。
トラックの再生に使用される playTrack メソッドのコードの下に貼り付けました。デバッガーを使用すると、以下のクロージャー内にブレークポイントを追加すると、アプリがフォアグラウンドに入るまでブレークポイントがトリガーされないことがわかります。
func playTrack(track: SongSearchResult) {
println("Playing track: \(track.title)")
Logging.sharedInstance.writeData(String(format: "%@:Playing track(%@)", __FUNCTION__, track.title))
audioPlayer?.stop()
if playPauseButton.enabled == false {
if let request: AnyObject = currentGetRequest {
SCRequest.cancelRequest(request)
}
}
currentGetRequest = SCRequest.performMethod(SCRequestMethodGET,
onResource: NSURL(string: track.streamURL),
usingParameters: nil,
withAccount: SCSoundCloud.account(),
sendingProgressHandler: nil,
responseHandler: {(response, data, error) in
dispatch_async(dispatch_get_main_queue()) {
var playerError: NSError? -----------------> BREAKPOINT SET HERE
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
AVAudioSession.sharedInstance().setActive(true, error: nil)
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
self.audioPlayer = AVAudioPlayer(data: data, error: &playerError)
self.audioPlayer?.delegate = self
self.delegate?.currentTrackChanged(self)
self.audioPlayer?.prepareToPlay()
self.audioPlayer?.play()
self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateTime:"), userInfo: nil, repeats: true)
self.playPauseButton.enabled = true
self.currentTimeSlider.enabled = true
}
})
}
Info.plist ファイルで既に UIBackgroundModes 'audio' 値を設定しています。誰かが私が間違っていることについて何か提案がありますか?
ありがとう、アビシェーク。