web-dev-qa-db-ja.com

コールキットスピーカーのバグ/ WhatsAppによる修正方法

Callkit機能を備えたアプリがあります。スピーカーボタンを押すと、ボタンが点滅し、アニメーションがオフの状態になります(スピーカーがLOUDに設定されていても、アイコンがまだオフの場合があります)。複数回タップすると、この機能が正しく動作していないことがはっきりとわかります。

ただし、WhatsAppの最初のスピーカーはオフになっており、3秒以上後にスピーカーがアクティブになり、機能します。誰かが似たようなことに遭遇し、解決策を教えてくれますか?

私の問題を示すYouTubeビデオリンク

25
Pan Mluvčí

Appleエンジニアが提案する回避策があります。これは、コールキットがオーディオセッションを正しくアクティブ化しないのを修正する必要があります。

回避策は、_-provider:performAnswerCallAction:_メソッドが呼び出される前に、アプリのライフサイクルの早い段階でアプリのオーディオセッションを構成する(configureAudioSession()を呼び出す)ことです。たとえば、_-[CXProvider reportNewIncomingCallWithUUID:update:completion:]_を呼び出す直前にconfigureAudioSession()を呼び出して、着信コールについてCallKitに通知する前にオーディオセッションが完全に設定されていることを確認できます。

差出人: https://forums.developer.Apple.com/thread/64544#1897

これで問題が解決しない場合は、動作を再現するサンプルプロジェクトを投稿して、さらに分析できるようにする必要があります。

3
Lukas

上記の答えは正しいですが、「VoiceChat」モードはすべてを台無しにします。

Swift 4 WebRTCの例。接続が確立された後、次の呼び出し

let rtcAudioSession = RTCAudioSession.sharedInstance()
rtcAudioSession.lockForConfiguration()
do {
    try rtcAudioSession.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: 
    AVAudioSession.CategoryOptions.mixWithOthers)
    try rtcAudioSession.setMode(AVAudioSession.Mode.default.rawValue)
    try rtcAudioSession.overrideOutputAudioPort(.none)
    try rtcAudioSession.setActive(true)
} catch let error {
    debugPrint("Couldn't force audio to speaker: \(error)")
}
rtcAudioSession.unlockForConfiguration()

RTCの代わりにAVAudioSession.sharedInstance()を使用できます

1
user1939508

たぶん、setModeをAVAudioSessionModeDefaultに設定できます。

CallKit + WebRTCを使用する場合

  1. AVAudioSessionModeDefaultモードを設定します。

  2. Alloc CXProviderおよびreportNewIncomingCallWithUUID

  3. WebRTCを使用します。ICEConnectedの後、WebRTCがモードをAVAudioSessionModeVoiceChatに変更すると、スピーカーの問題が発生します。

  4. その後、ModeをAVAudioSessionModeDefaultに戻したところ、スピーカーは正常に動作しました。

1
sx_bruce

次の手順で問題を解決しました。

  • CXAnswerCallActionで、以下のコードを使用してaudiosession構成を設定します。

    RTCDispatcher.dispatchAsync(on: RTCDispatcherQueueType.typeAudioSession) {
    let audioSession = RTCAudioSession.sharedInstance()
    audioSession.lockForConfiguration()
    let configuration = RTCAudioSessionConfiguration.webRTC()
    configuration.categoryOptions = [AVAudioSessionCategoryOptions.allowBluetoothA2DP,AVAudioSessionCategoryOptions.duckOthers,
                                     AVAudioSessionCategoryOptions.allowBluetooth]
    try? audioSession.setConfiguration(configuration)
    audioSession.unlockForConfiguration()}
    
  • 通話が接続された後、AudioSessionカテゴリをデフォルトにリセットしています。

    func configureAudioSession() {
    let session = RTCAudioSession.sharedInstance()
    session.lockForConfiguration()
    do {            
        try session.setCategory(AVAudioSession.Category.playAndRecord.rawValue, with: .allowBluetooth)
        try session.setMode(AVAudioSession.Mode.default.rawValue)
        try session.setPreferredSampleRate(44100.0)
        try session.setPreferredIOBufferDuration(0.005)
    } 
    catch let error {
        debugPrint("Error changeing AVAudioSession category: \(error)")
    }
    session.unlockForConfiguration()}
    

SO @АлексейСмольский に感謝します。

0

から参照システム提供の通話画面のスピーカーボタンの異常な動作

以前のバージョンでも同じ問題が発生しています。したがって、これはコールキットで発生する新しい問題ではありません。この問題はiOSから解決する必要があります。これを制御することはできません。

Apple開発者フォーラムをご覧ください

CallKit /検出スピーカーセット

そして

[CALLKIT]オーディオセッションがアクティブになっていませんか?

0
Britto Thomas