私はカスタムプレイヤーをSoundCloudにしようとしています。Swift-iOS(forward & backward)機能でフルプレーヤーのプレーヤーをネイティブサポートしていないので、私はその後、AVQueuePlayerの代わりにAVPlayerを使用することに決めました。AVPlayerはバックグラウンドでAVPlayerItemsを切り替えることはありません
私のトラック(URL)に関する関連情報を保持するTracksクラスがあります。キューに関する関連情報を持つTracksQueue - 複数のトラック&トラック配列の配列インデックスをチェックして論理を転送または逆転できるかどうか。
私も同様のAppはなく、唯一の予想通り
UIApplication.shared.beginReceivingRemoteControlEvents()
すべてが働いている私のViewControllerののviewDidLoad()で起動している間、そうすることを提案していたなど、多くの次のコードを追加したとして、アプリの設定でバックグラウンドモードを有効にしています問題はトラックがバックグラウンドで変化することですが、再生されません。
AVPlayerからオブザーバを削除して新しいものを開始し、NSNotification.Name.AVPlayerItemDidPlayToEndTime通知時に現在のアイテムを新しいAVPlayerItemに置き換えます。
fileprivate func restartCurrentTrack() {
if (player != nil) {
player?.removeObserver(self, forKeyPath: Keys.Status, context: &PGAudioPlayerManagetKVOContext)
}
if let _currentTrack = queue.currentTrack {
player = AVPlayer()
player.addObserver(self, forKeyPath: Keys.Status, options: NSKeyValueObservingOptions.new, context: &PGAudioPlayerManagetKVOContext)
if let _playerItem = _currentTrack.getPlayerItem() {
player?.replaceCurrentItem(with: _playerItem)
}
}
}
編集1:アプリがバックグラウンドになったときに再生が行われない理由が1つ見つかりました。私はKVOを持っています。このKVOは、プレイヤーがステータスをチェックしてプレイする準備ができていることを知らせます。私が同じものを受け取ったときだけ開始する
player.play()
しかし、アプリがバックグラウンドになると、この通知は受信されなくなります。アプリがバックグラウンドであっても通知を受け取る方法はありますか?
編集2:音楽をフォアグラウンドで再生すると、アプリは音楽を再生します。バックグラウンドでのトラックの変更は、アプリを前面に持っていない限り、プレイヤーのKVOがトリガーされないことが問題です。
にSO上で提供される情報を使用 – user6083088
私は旗を引っ込めましたが、これは別の重複です:https://stackoverflow.com/questions/36348332/why-is-avplayer-not-continuing-to-next-song-while-in-backgroundすでに存在している質問を検索しますか?多分あなたはまだ試したことがある何かを見つけるでしょう –
@スニークはい、私はこれと多くの同様の記事を見てきました。しかし、彼らの誰も理論以外の解決法を提案していない。そして今のところそれはうまく機能しません。提案する解決策は、次の項目に進むことについてのみ話しますが、私はまた逆にする必要があり、AVQueuePlayerはそれをサポートしていません。多くのAVPlayerが提案されましたが、すぐにアプリがバックグラウンドに移行し、SOのSOLに提案されたソリューションがすべて変更されました。 – user6083088