0

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' 値を設定しています。誰かが私が間違っていることについて何か提案がありますか?

ありがとう、アビシェーク。

4

2 に答える 2

0

わかりました-問題を理解したと思います。このリンクを見てください:目標 c - beginBackgroundTaskWithExpirationHandler の適切な使用

アプリケーションはバックグラウンド オーディオ用に登録されているため、トラックが終了するとすぐにバックグラウンド オーディオが停止し、その結果、(バックグラウンドにある) アプリケーションは他のタスク (次のトラックにスキップ) を完了する時間がありません。

于 2015-02-21T18:49:44.793 に答える
0

また、AVAudioSession カテゴリ/アクティブを設定し、dispatch_async() 呼び出し内に設定していることも追加します.beginReceivingRemoteControlEvents()。これは、再生メカニズムが最初に設定されたときにグローバルレベルで実際に実行する必要があります (おそらく、あなたの場合は viewDidLoad で) .

100% 確信はありませんが、dispatch_asyn(dispatch_get_main_queue()) がバックグラウンドで実行されるとは思いませんか? どちらの方法でもこれを確認していませんが、バックグラウンドでメイン キューが中断されていることは理にかなっています。そのディスパッチ呼び出しを完全に削除してみてください。SCRequest には詳しくありませんが、AFNetworking に似ている場合は、とにかくメイン キューでその完了ブロックを呼び出している可能性があります。

于 2015-02-27T18:23:21.453 に答える