【问题标题】:Trigger an incoming VoIP call using CallKit and Twilio-Video API使用 CallKit 和 Twilio-Video API 触发传入的 VoIP 呼叫
【发布时间】:2017-05-20 19:28:17
【问题描述】:

通过使用 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)
    }
}

【问题讨论】:

  • 您是否使用 Twilio Video 将视频通话与接受/拒绝选项集成在一起?请帮我。可能吗?我该怎么做?请告诉我
  • @NikunjJadav 我建议你从这里开始,github.com/twilio/video-quickstart-swift
  • @user44776,默认情况下,Twilio Video 有 VoIP 通知,或者您手动集成了 VoIP。
  • 我正在尝试实现此功能并遇到同样的问题。有人可以帮忙吗? Pushkit 的 Twilio 视频 SDK 文档不存在。

标签: ios twilio twilio-api callkit


【解决方案1】:

发布迟到的答案,但它可能对某人有帮助。

按照我处理语音来电的代码。

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

下面是我添加的call kit的委托方法

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

阅读本教程,它将起作用。

【讨论】:

  • 以上代码是您发布的语音通话。但我需要视频通话。请您给我发送仅用于视频通话的代码,也请给我发送代码 fireLocalNotificationForVoiceCall(didStart: true) 功能代码
【解决方案2】:

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

并且请不要在没有修改的情况下对payload进行任何更改,以便SDK从payload中提取来电信息,以便SDK可以通知应用程序有来电

【讨论】:

    【解决方案3】:

    这里是 Twilio 开发者宣传员。

    我对 iOS 不是特别擅长,但快速查看一下 PKPushRegistryDelegate 的文档,您的 pushRegistry 函数定义似乎不正确。

    应该是

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

    didReceiveIncomingPushWith 而不是didReceiveIncomingPushWithPayload

    或者,这与您将forType 转换为String 的事实有关吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多