2017-11-21 5 views
0

私はCallKitアプリケーションを開発中です。問題はあります。ユーザーがアプリ内呼び出し画面に戻るまでCallKit画面でコールを「スワップ」すると、コールを交換した後にCallKitがサウンドを再アクティブ化できる

supportsHolding = false 

を私は、私はこの問題を解決することができ、これを正しく行うことができます例えばのWhatsApp:私は更新することで、これをバイパスすることができます!

p.s.私はwebrtcを使って電話をかけています!

ありがとうございました!

EDIT:

これは、プロバイダのコードです:

public func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) { 

    guard let call = conductor!.callWithUUID(uuid: action.callUUID) else { 
     WebRtcConductor.debug("\(self.TAG) failed to perform HeldAction: uuid: \(action.uuid), calluiid: \(action.callUUID)") 
     action.fail() 
     return 
    } 

    setIsHeld(call: call, isHeld: action.isOnHold) 
    action.fulfill() 
} 

setIsHeld機能は、単に実行します。私はcallkit画面の "ミュート" ボタンを使用している場合

audioTrack.isEnabled = enabled 

を、すべてが正常に動作します私はwebrtc呼び出しから通常の呼び出しにスワイプすると、CXSetHeldCallActionが呼び出され、オーディオトラックが無効になりました。私が再びwebrtc呼び出しにスワイプすると、オーディオトラックは有効になりますが、私は何もしません何も聞こえない、私がメインのアプリ画面に戻ると、オーディオは再びうまくいく!

+0

あなたが書いた関連コードを表示するだけでなく、何が起こっているのか、何が起こるのかを明確に説明してください。 – jbehrens94

+0

もっとコードを追加しました!ありがとう! –

答えて

0

同じ問題がありました。 1つのアクティブなコールがある場合、新しいコールが着信しています。私は&を受け付けます。新しい通話は機能しますが、を使用した後はCallKitで音声が停止します。 CXProviderDelegateプロトコルからprovider:performSetHeldCallAction:方法は、あなたが実際にCallKitネイティブインターフェースを介してSwap通話用の音声を有効/無効にできますスポットであることがわかっ

私のケースでは、コールがOnHoldに入れていたためにaudioController.deactivateAudioSession()メソッドを使用しました。 しかし、という同じメソッドが、CallKit経由でSwapタップをタップすると(OnHold状態から)アクティブになる他のコールに対して起動されていることがわかりました。

これで、通話の状態(保留かどうか)ごとにオーディオを非アクティブ化/アクティブ化するだけです。それはこのようになります一般的な方法で

func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) { 
    // Retrieve the Call instance corresponding to the action's call UUID 
    guard let call = callManager.callWithUUID(uuid: action.callUUID) else { 
     action.fail() 
     return 
    } 

    // Update the Call's underlying hold state. 
    call.isOnHold = action.isOnHold 

    // Stop or start audio in response to holding or unholding the call. 
    if call.isOnHold { 
     stopAudio() 
    } else { 
     startAudio() 
    } 

    // Signal to the system that the action has been successfully performed. 
    action.fulfill() 
} 

P.S. Audioセッションに応答するクラスをいくつか用意する必要があるようです。種類はactivate audio session/deactivate audio sessionでなければなりません。

関連する問題