Запуск входящего вызова VoIP с помощью CallKit и Twilio-Video API

Используя одно из примеров приложений для видеозвонков, предоставленных Twilio (VideoCallKitQuickStart), я пытается вызвать входящий вызов, отправив уведомление VoIP в приложение. Но приложение не вызывает входящий звонок. Я также пытался держать приложение открытым при отправке уведомления VoIP, и приложение вылетало, выбрасывая исключение ниже

NSInvalidArgumentException: попытка вставить объект списка не относящихся к свойствам 'PKPushPayload: 0x16e44af0' для ключевой полезной нагрузки

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

Ниже мой код в файле ViewController.swift

 func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) {
        // Process the received push

        self.reportIncomingCall(uuid: UUID(), roomName: "testRoom", completion: nil)
    } 

func reportIncomingCall(uuid: UUID, roomName: String?, completion: ((NSError?) -> Void)? = nil) {

    let callHandle = CXHandle(type: .generic, value: roomName ?? "")
    let callUpdate = CXCallUpdate()
    callUpdate.remoteHandle = callHandle
    callUpdate.supportsDTMF = false
    callUpdate.supportsHolding = true
    callUpdate.supportsGrouping = false
    callUpdate.supportsUngrouping = false
    callUpdate.hasVideo = true

    callKitProvider.reportNewIncomingCall(with: uuid, update: callUpdate) { error in
        if error == nil {
            NSLog("Incoming call successfully reported.")
        } else {
            NSLog("Failed to report incoming call successfully: \(error?.localizedDescription).")
        }
        completion?(error as? NSError)
    }
}

person SpaceX    schedule 06.01.2017    source источник
comment
Вы интегрировали видеозвонок с опцией «Принять / отклонить» с помощью Twilio Video? Помогите, пожалуйста. Является ли это возможным? и как я могу это сделать? Пожалуйста, дай мне знать   -  person Nikunj Jadav    schedule 02.07.2017
comment
@NikunjJadav Я предлагаю вам начать здесь, github.com/twilio/video-quickstart-swift < / а>   -  person SpaceX    schedule 03.07.2017
comment
@ user44776, По умолчанию Twilio Video имеет уведомление VoIP или вы интегрировали VoIP вручную.   -  person Sathish Kumar Gurunathan    schedule 29.11.2018
comment
Я пытаюсь реализовать эту функцию, но у меня такая же проблема. Кто-нибудь может помочь? Документация Twilio Video SDK для Pushkit не существует.   -  person GeekyDeveloper    schedule 28.05.2021


Ответы (3)


Отправляю поздний ответ, но это может быть полезно для кого-то.

Следующий код, который я сделал для обработки входящего голосового вызова.

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
    NSLog("pushRegistry:didReceiveIncomingPushWithPayload:forType:")
    print(payload)
    if (type == PKPushType.voIP) {
        TwilioVoice.handleNotification(payload.dictionaryPayload, delegate: self)

        pushKitPushReceivedWithPayload(payload: payload)
    }
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
    NSLog("pushRegistry:didReceiveIncomingPushWithPayload:forType:completion:")

    if (type == PKPushType.voIP) {
        TwilioVoice.handleNotification(payload.dictionaryPayload, delegate: self)

        pushKitPushReceivedWithPayload(payload: payload)
    }

    completion()
}

func pushKitPushReceivedWithPayload(payload: PKPushPayload){
    if UIApplication.shared.applicationState != .active{
        let msgType = payload.dictionaryPayload["twi_message_type"] as? String
        if let messageType = msgType{
            if messageType == "twilio.voice.call"{
                fireLocalNotificationForVoiceCall(didStart: true)
            }else if messageType == "twilio.voice.cancel"{
                fireLocalNotificationForVoiceCall(didStart: false)
            }
        }
    }
}

Ниже приведены методы делегата набора вызовов, которые я добавил.

extension AppDelegate : TVONotificationDelegate, TVOCallDelegate
{
  func callInviteReceived(_ callInvite: TVOCallInvite) 
  {
   if (callInvite.state == .pending) 
   {
        //code
   } 
   else if (callInvite.state == .canceled) 
   {
        //code
   }
  }
  func handleCallInviteReceived(_ callInvite: TVOCallInvite) 
  {
        //code
  }

  func handleCallInviteCanceled(_ callInvite: TVOCallInvite) 
  {
        //code
  }
}

Я следил за этим руководством, предоставленным twilio - https://github.com/twilio/voice-quickstart-swift

Пройдите это руководство, и оно будет работать.

person iDeveloper    schedule 23.10.2018
comment
Приведенный выше код предназначен для голосового вызова. но мне нужен видеозвонок. Не могли бы вы прислать мне код только для видеозвонка, а также, пожалуйста, пришлите мне код fireLocalNotificationForVoiceCall (didStart: true), код функции - person ; 15.02.2019

Проповедник разработчиков Twilio здесь.

Я не очень хорошо разбираюсь в iOS, но, взглянув на документацию для PKPushRegistryDelegate, похоже, что ваше pushRegistry определение функции неверно.

Должен быть

func pushRegistry(_ registry: PKPushRegistry, 
    didReceiveIncomingPushWith payload: PKPushPayload, 
    forType type: PKPushType)

То есть didReceiveIncomingPushWith, а не didReceiveIncomingPushWithPayload.

В качестве альтернативы, имеет ли это какое-либо отношение к тому, что вы преобразуете forType в String?

person philnash    schedule 06.01.2017

Swift 3.0

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {
    NSLog("pushRegistry:didReceiveIncomingPushWithPayload:forType:")

    if (type == PKPushType.voIP) {
        print(payload.dictionaryPayload)
        VoiceClient.sharedInstance().handleNotification(payload.dictionaryPayload, delegate: self)
    }
}

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

person krish    schedule 24.04.2017