Нет звука при использовании CallKit - как узнать, что другая сторона отвечает, удерживается или завершает звонок? - PullRequest
0 голосов
/ 05 июля 2018

Я использую следующий код для проверки CallKit. Я могу вызвать исходящий вызов с устройства «A» и, используя VoIP, получить UUID, вызвать функцию входа на устройстве «B». Но когда я нажимаю кнопку ответа на вызов «B», звук («A» и «B») не возникает. Я не получаю никакого обратного вызова делегата на «А», чтобы узнать другую сторону о каком-либо действии.

Как я могу узнать, что состояние обратного вызова устройства «B» означает ответ, отклонение, удержание или завершение вызова на устройстве «A»?

Используется ли метод VoIP для уведомления устройства "A" или я пропускаю шаг?

Файл ProviderDelegate.swift

import Foundation
import CallKit

class ProviderDelegate: NSObject, CXProviderDelegate {
    static let sharedInstance = ProviderDelegate()
    var provider: CXProvider!
    var controller: CXCallController!

    override init() {
        controller = CXCallController()

        let providerConfiguration = CXProviderConfiguration(localizedName: "My App name")
        providerConfiguration.supportsVideo = true
        providerConfiguration.maximumCallsPerCallGroup = 1
        providerConfiguration.supportedHandleTypes = [.generic]

        provider = CXProvider(configuration: providerConfiguration)

        super.init()

        provider.setDelegate(self, queue: nil)
    }

    func incomingCall(uuid: UUID) {
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .generic, value: "Any name")
        provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in })
    }

    func outgoingCall(uuid: UUID) {
        let transaction = CXTransaction(action: CXStartCallAction(call: uuid, handle: CXHandle(type: .generic, value: "Any name")))
        controller.request(transaction, completion: { error in })
    }

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

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

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

    func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
        print ("CXStartCallAction")
        configureAudioSession()

        provider.reportOutgoingCall(with: action.uuid, startedConnectingAt: nil)
        provider.reportOutgoingCall(with: action.uuid, connectedAt: nil)
        action.fulfill()
    }

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

Файл Audio.swift

import Foundation
import AVFoundation

func configureAudioSession() {
    print("Configuring audio session")
    let session = AVAudioSession.sharedInstance()
    do {
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try session.setMode(AVAudioSessionModeVoiceChat)
        try session.setActive(true)
    } 
    catch (let error) {
        print("Error while configuring audio session: \(error)")
    }
}

func startAudio() {
    print("Starting audio")
}

func stopAudio() {
    print("Stopping audio")
}

Редактировать

Используйте Apple VOIP для отправки и получения UUID

Файл AppDelegate.swift

let providerDelegate = ProviderDelegate.sharedInstance

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
    let payloadDict = payload.dictionaryPayload["aps"] as! NSDictionary
    let uuid = payloadDict.object(forKey: "uuid") as! String

    providerDelegate.incomingCall(uuid: UUID.init(uuidString: uuid)!)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...