2017-11-21 8 views
0

CallKit 응용 프로그램을 개발 중입니다. 문제가 있습니다. 사용자가 인앱 전화 화면으로 돌아올 때까지 CallKit 화면에서 전화를 "바꿔 치기"할 때 통화 보류가 오디오를 다시 시작하지 못합니다.CallKit은 통화를 바꾼 후에 소리를 다시 활성화 할 수 있습니다.

supportsHolding = false 

을하지만 나는이 문제를 해결할 수, 제대로 수행 할 수 있습니다 예를 들어, WhatsApp에 : 나는 업데이트하여이 문제를 우회 할 수있다!

p.s. 나는 webrtc를 사용하여 전화를 걸고 있습니다!

감사합니다.

편집 :

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 기능을 간단하게 수행합니다 :

audioTrack.isEnabled = enabled 

내가 사용하는 경우 callkit 화면의 "음소거"버튼을, 모두가 잘 작동

이 공급자의 코드 ,하지만 만약 내가 2 활성 통화 webrtc 전화에서 정상적인 호출, CXSetHeldCallAction 호출 및 오디오 트랙을 사용하지 못했습니다, 내가 다시 webrtc 전화로 스 와이프, 오디오 트랙을 사용할 수 있지만 내가 할 아무 것도 듣지 않습니다. 기본 앱 화면으로 돌아 가면 오디오가 다시 정상적으로 작동합니다.

+0

작성한 관련 코드를 표시하고 발생 상황과 예상되는 상황을 명확하게 설명하십시오. – jbehrens94

+0

더 많은 코드를 추가했습니다! 감사! –

답변

0

같은 문제가있었습니다. 1 개의 활성 통화가 있고 새 통화가 수신되면 &을 수락합니다. 새 통화가 작동하지만 을 CallKit에서 사용하면 오디오가 작동하지 않습니다.

CXProviderDelegate 프로토콜에서 provider:performSetHeldCallAction: 방법은 당신이 실제로/비활성화 CallKit 기본 인터페이스를 통해 Swap 통화에 대한 오디오를 활성화 할 수있는 곳입니다 것을 발견했다.

내 경우에는 호출이 OnHold에서 처리 중이기 때문에 audioController.deactivateAudioSession() 메서드를 사용했습니다. 그러나 CallKit을 통해 Swap 버튼을 누를 때 (OnHold 상태에서) 활성화 된 다른 통화에 대해 동일한 방법 provider:performSetHeldCallAction:이 실행 되었음이 확인되었습니다.

따라서 통화 상태 (대기 중 또는 대기 중)에 따라 오디오를 비활성화/활성화하면됩니다.

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() 
} 

추신 : 일반적인 방법으로

는이 방법을 찾아야한다 Audio 세션에 응답하는 클래스가 있어야합니다. 종류는 activate audio session/deactivate audio session이어야합니다.