0

バックグラウンドで続行する必要があるAVAudioPlayerがあります。

オーディオはplistのバックグラウンドモードとして設定されており、これは起動時に実行されます。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[[RootController shared].view becomeFirstResponder];

AVAudioSession* session = [AVAudioSession sharedInstance];
[session setDelegate: self];
[session setActive:YES error:nil];
[session setCategory: AVAudioSessionCategoryPlayback error:nil];

- (BOOL)canBecomeFirstResponder { return YES; }

問題

時折、AVAudioPlayerは次のような奇妙な状態になります。

  • 再生中ですが、ステータスバーの再生アイコンが消えます
  • 一時停止してから再生すると、アイコンが1秒間表示されてから、消えます。
  • これがキッカーです-setCurrentTimeプレイ中に電話をかけると、プレイアイコンが表示されたままになります

私はこれに約20時間沈みました、そしてどんなアイデアでも好きです。

4

1 に答える 1

4

バグの説明

再生している場合はAVAudioPlayer、を作成するAVPlayerと、再生アイコンが消えます。どうやらAVPlayerすぐに優先され、まだ再生されていないため、再生アイコンがステータスバーから消えます。

これはいくつかの深刻な問題を引き起こします:

  1. アプリがバックグラウンドにある場合、iOSは5秒以内にAVAudioPlayerをシャットダウンします(オーディオを再生していることに気付かないため)
  2. オーディオが再生されているにもかかわらず、iOSリモートに再生ボタンが表示される
  3. 再生アイコンがステータスバーに表示されない

回避策

まず、を使用する必要がない場合は、使用AVPlayerしないでください。最初にダウンロードせずにリモートMP3を再生する必要があるため、これを使用します。以前はこのAudioStreamerクラスを使用していましたが、ストリームが切断されたときにアラートがポップアップし、修正できなかった他のいくつかのバグがあるため、あきらめました。

したがって、AVPlayerで立ち往生している場合は、再生ステータスをに再接続する唯一の方法がありますAVAudioPlayerを呼び出すsetCurrentTimeAVAudioPlayer、アプリの現在のプレーヤーとして魔法のように再関連付けされます。AVPlayerしたがって、いずれかが初期化された後、およびで再生を再開するときはいつでも、それを呼び出す必要がありますAVAudioPlayer

AVAudioPlayerをサブクラス化して、グローバルリストに登録し(初期化時に)、割り当てを解除したときに登録を解除できるようにすることにしました。また、playメソッドをオーバーライドして、再生を再開するための呼び出しもsetCurrentTimeを呼び出すようにします。次に、AVPlayerをサブクラス化して、初期化されるたびに、アクティブなすべてのAVAudioPlayerが自分自身でsetCurrentTimeを呼び出すようにしました。最後setCurrentTimeに、少しの間、おそらく1秒後に電話をかける必要があります。そうしないと、効果がありません。

冗談ではありません。これは、40時間近くのトラブルシューティングの結果です。

于 2012-08-10T19:44:54.160 に答える