これで、アプリの作成に成功しました。この場合は、linphone sip ライブラリを使用した VOIP アプリです。アプリがフォアグラウンドかバックグラウンドかに関係なく、WAV ファイルを常に再生するいくつかのテストを行っていました。次のコードを使用して、このテストを正常に実装できました。
NSString * resourcePath = [NSString stringWithFormat:@"%@/myres/sounds/oldphone-mono.wav",[[NSBundle mainBundle] resourcePath]];
ringer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:resourcePath] error:nil];
[ringer setNumberOfLoops:100];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[ringer setVolume:1.0];
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);
[ringer play];
別のスタック オーバーフローの回答からコピーしたので、これはかなり単純なコードだと思います。また、オーディオのバックグラウンド再生を可能にするために、plist ファイルに何かをしなければなりませんでした。
したがって、問題は、いくつかのサードパーティ ソフトウェア (この場合は LinPhone SIP ライブラリの Receive Incoming Call Function) の関数が起動すると、アプリがサウンド ファイルをバックグラウンドで再生できないようにすることです。
例として、テストケースを次に示します。
- アプリを起動すると、鳴っている wav ファイルが聞こえます。
- アプリをバックグラウンド モードにしましたが、まだ wav ファイルが鳴っています。問題ありません。
- アプリにフォーカスを戻しますが、まだ呼び出し音が聞こえます。問題ありません
- linphone の受信呼び出し機能をトリガーします。フォアグラウンドにいるため、呼び出し音が引き続き鳴ります。これで問題ありません。
- アプリをバックグラウンド モードにすると、呼び出し音が止まり、よくありません
そのため、linphone が avaudioplayer/avaudiosession に対して何らかの操作を行ったため、バックグラウンドで再生できなくなったのではないかと考えています。私の質問は、私のアプリがバックグラウンドでサウンドを再生するのを防ぐために linphone が何をしたのか、そしてこの問題をどのように回避できるのか、誰でも推測できますか?
その他の注意事項
アプリがバックグラウンドにある間、毎秒新しい avaudioplayer をインスタンス化しようとさえしました。しかし、音声の再生を無音にするために linphone が行ったことを無効にすることはできませんでした。