CallKit + WebRT C: вызов CallKit отключается при нажатии кнопки блокировки / включения питания в iOS - PullRequest
0 голосов
/ 27 февраля 2020

Это приложение для проведения конференций, и я инициирую исходящий вызов, чтобы сделать мой VoIP-вызов высокоприоритетным и не прерывать входящий вызов, когда я нахожусь в режиме VoIP-вызова.

Я использую WebRT C + CallKit в моем приложении. Я начал вызов, и когда я нажимаю кнопку блокировки / включения, вызов CallKit отключается, и звуковой маршрут вызова My Voip меняется на Приемник и остается.

Зачем блокировать iPhone, завершающий вызов.

Вот мой код.

 var callUUID: UUID?

extension AppDelegate {
    func initiateCallKitCall() {
        let config = CXProviderConfiguration(localizedName: "Huddl.ai")
        config.includesCallsInRecents = false;
        config.supportsVideo = true;
        config.maximumCallsPerCallGroup = 1
        provider = CXProvider(configuration: config)
        guard let provider = provider else { return }
        provider.setDelegate(self, queue: nil)
        callController = CXCallController()
        guard let callController = callController else { return }
        callUUID = UUID()
        let transaction = CXTransaction(action: CXStartCallAction(call: callUUID!, handle: CXHandle(type: .generic, value: "Huddl.ai")))
        callController.request(transaction, completion: { error in
            print("Error is : \(String(describing: error))")
        })

    }

    func endCallKitCall(userEnded: Bool) {
        self.userEnded = userEnded
        guard provider != nil else { return }
        guard let callController = callController else { return }
        if let uuid = callUUID {
            let endCallAction = CXEndCallAction(call: uuid)
            callController.request(
                CXTransaction(action: endCallAction),
                completion: { error in
                    if let error = error {
                        print("Error: \(error)")
                    } else {
                        print("Success")
                    }
                })
        }
    }

    func isCallGoing() -> Bool {
        let callController = CXCallController()
        if callController.callObserver.calls.count != 0 {
            return true
        }
        return false
    }
}

extension AppDelegate: CXProviderDelegate {

    func providerDidReset(_ provider: CXProvider) {
        print("-Provider-providerDidReset")
    }

    func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        print("-Provider-perform action: CXAnswerCallAction")
        action.fulfill()
    }

    func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
        action.fulfill()
        print("-Provider: End Call")
    }

    func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
        action.fulfill()

        DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 3) {
            provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: Date())
            DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 1.5) {
                provider.reportOutgoingCall(with: action.callUUID, connectedAt: Date())
            }
        }
    }

    func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
        action.fulfill()
    }

    func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
        RTCAudioSession.sharedInstance().audioSessionDidActivate(audioSession)
        RTCAudioSession.sharedInstance().isAudioEnabled = true
    }

    func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
        RTCAudioSession.sharedInstance().audioSessionDidDeactivate(audioSession)
        RTCAudioSession.sharedInstance().isAudioEnabled = false
    }
}

1 Ответ

0 голосов
/ 28 февраля 2020

Кнопка питания завершает вызов, если и только если вызов выполняется через встроенный динамик в верхней части экрана (приемник). В любом другом случае (т. Е. Звук воспроизводится через наушники, Bluetooth или встроенный громкоговоритель), кнопка питания не завершит вызов.

То же самое верно и для стандартных телефонных звонков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...