3

iOS5がオーディオの動作を変更する方法に問題があるオーディオアプリがあります。アプリの音声が再生されているときに(AVAudioSessionCategoryPlayback)、OSからClock.appアラームまたはタイマーが発生すると、UIAlertView通知がポップアップしますが、音声アラートは表示されません。私のアプリケーションの音は音声アラートの邪魔にならないようにうまく鳴りますが、アラームアプリの音声アラートは鳴りません。

当然のことながら、iOS5の変更に大量のサポートリクエストが寄せられました。アラームの音声が聞こえるように設定することで一時的にこれを解決しましkAudioSessionProperty_OverrideCategoryMixWithOthersたが、これを行うと非常に望ましくない副作用がいくつかあります。

  • 他のアプリのオーディオは、私と一緒に/私の上で再生できます。
  • リモートコントロールイベントは私のアプリではなく、iPod.appにルーティングされます。

上記の欠点はどれも私のアプリの要件には受け入れられません。私はこれをしばらくの間ハッキングしてきましたが、それを解読することはできませんでした。次のようにオーディオを設定するにはどうすればよいですか。

  1. 私のアプリのオーディオは、引き続きAVAudioSessionCategoryPlaybackバックグラウンドオーディオのカテゴリを使用しています。
  2. Clock.appアラームには、引き続き音声アラートが鳴ります
  3. アプリは引き続きリモコン通知に応答します
4

1 に答える 1

3

この質問を書いた後、私はこれに関するバグレポートを提出しに行きました。問題を再現できると思った小さなサンプルプロジェクトを作成しましたが、再現できませんでした。これにより、私はもう一度深く掘り下げて、ここに何があったのかを理解しようとしました…</ p>

iOSアラームを起動し、ブレークポイントを配置audioPlayerBeginInterruption:して、デバッガーでコードを1行ずつトレースしました。コードが実行される前に(デバッガーで一時停止している間)、iOS5のアラームが鳴っていることに気づきました。幸いなことに、アプリをステップ実行している間も音が鳴っていたので、どのコードが音を止めたのかを特定することができました。

私のinterruptHandlerの一部は、(明らかに)アプリの内部オーディオを停止して、中断を通過させることです。私はこれまでこの方法を調べることを考えたことはありませんでしたが、そこに問題があったことがわかりました。prepareToPlay私のstopメソッドは、停止直後に呼び出して、次回の再開を高速化します。

[self.player stop];
[self.player prepareToPlay]; // <- iOS 5 alarm sound stopped here.

ドキュメントにはprepareToPlayメソッドが記載されています

バッファをプリロードし、再生に必要なオーディオハードウェアを取得します。これにより、playメソッドを呼び出してからサウンド出力を開始するまでの遅延が最小限に抑えられます。

合理的に聞こえますが、これはiOSのバージョンが少ない場合に機能しました。私の仮説では、はClock.appアラームシステムに変更を加えて、新しいアラーム音がハードウェアを使用するようにしましたが、以前はソフトウェアを使用していました。これが、一部のアプリでiOS5のアラームが鳴らない原因になっていると思います。

線を削除すると、prepareToPlayを使用せずにアラームが鳴りkAudioSessionProperty_OverrideCategoryMixWithOthers、この質問で提示されたすべての問題が解決されました。


TL; DR

サウンドコードロジックprepareToPlayから呼び出しを削除します。stop後で開始するのにマイクロ秒長くかかりますが、音が途切れる可能性があります。

于 2011-11-20T17:47:59.183 に答える