フォアグラウンド内外を移動して他のオーディオとうまくやりとりするアプリを開発するときに私が目にする主な問題です。私が普段何をしているのかを知るために、最近のプロジェクトの抜粋をいくつか紹介します。 (これらは意図的に不完全であり、一点を説明することのみを目的としています)。議論のために、オーディオセッションの維持を担当するAudioManagerクラスがあるとします。このクラスは、カスタムオーディオプレーヤーをインスタンス化するために使用するクラスです。私たちが置かようなクラスでは:
@interface MyAudioManager()
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession;
@property (nonatomic, retain) MyCustomAudioPlayer *player;
@end
@implementation MyAudioManager
@synthesize alwaysMaintainAudioSession;
@synthesize player;
-(void) applicationWillEnterForeground
{
isInBackground = NO;
if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession) {
[self activateAudioSession];
}
}
-(void) activateAudioSession
{
AudioSessionSetActive(TRUE);
AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self);
}
-(BOOL) anyAudioIsPlaying
{
return [self otherAudioIsPlaying] || [player isPlaying];
}
-(BOOL) otherAudioIsPlaying
{
UInt32 yesNo;
UInt32 propertySize = sizeof(yesNo);
OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo);
if (kAudioSessionUnsupportedPropertyError == status) {
return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState];
} else {
return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo;
}
}
マネージャーは、常に我々は常にセッションがアクティブであるか、他のいくつかのアプリが再生されるか確認して意味のアプリの音にリンクされているボリュームコントロールを保持プロパティを設定することができますオーディオ。それ以外の場合には、ボリュームコントロールはリンガーのコントロールに戻ります。したがって、フォアグラウンドに入るときは、他のオーディオ再生を確認し、条件付きでオーディオセッションをアクティブにする必要があります。また、リンガ音量コントロールを復元するためにバックグラウンドに移動するときにセッションを閉じる必要があります。私の解決策では
-(void) applicationDidEnterBackground
{
if (NO==[self anyAudioIsPlaying]) {
AudioSessionSetActive(NO);
}
}
私は、Bluetoothオーディオデバイスが接続されている場合にインテリジェントに応答のようなもの、カスタムプレーヤ、カスタムオーディオ圧縮などを作成するためのファクトリメソッドを処理するために、他のコードの束を含んでいます。しかし、主なアイデアは、フォアグラウンドでアプリケーションボリュームにボリュームコントロールをリンクさせようと試みながら、オーディオを再生する他のアプリケーションを処理することです。
あなたはiOSのドキュメントを見ましたか?この振る舞いは人間のインタラクションのガイドラインでよく定義されており、実装例も含めています。 –
あなたの質問は、オントピックであっても、このQ&Aフォーマットには少し広すぎます。 – hotpaw2