Swift

電話を受ける

のトップにある。 ViewController クラスの下にある client 宣言に、進行中のコールへの参照を保持する文字列プロパティを追加する。

class ViewController: UIViewController {
    
    let connectionStatusLabel = UILabel()
    let client = VGVoiceClient()
    var callID: String?
    ...
}

アプリケーションがコールを受信したとき、そのコールを受け入れるか拒否するかを選択できるようにします。そのためには displayIncomingCallAlert 関数を ViewController クラスである。

class ViewController: UIViewController {
    ...
    func displayIncomingCallAlert(callID: String, caller: String) {
        let alert = UIAlertController(title: "Incoming call from", message: caller, preferredStyle: .alert)
        
        alert.addAction(UIAlertAction(title: "Answer", style: .default, handler: { _ in
            self.client.answer(callID) { error in
                if error == nil {
                    self.callID = callID
                }
            }
        }))
        
        alert.addAction(UIAlertAction(title: "Reject", style: .destructive, handler: { _ in
            self.client.reject(callID) { error in
                if let error {
                    self.connectionStatusLabel.text = error.localizedDescription
                }
            }
        }))
        
        self.present(alert, animated: true, completion: nil)
    }
}

について displayIncomingCallAlert 関数は、呼び出しIDと呼び出し元をパラメータとして受け取る。関数内の UIAlertAction を割り当てます。 callID 以前から

使用方法 displayIncomingCallAlert を使用する必要があります。 VGVoiceClientDelegate この関数は、クライアントが受信した VGVoiceInvite.

extension ViewController: VGVoiceClientDelegate {
  ...

  func voiceClient(_ client: VGVoiceClient, didReceiveInviteForCall callId: String, from caller: String, withChannelType type: VGVoiceChannelType) {
      DispatchQueue.main.async { [weak self] in
          self?.displayIncomingCallAlert(callID: callId, caller: caller)
      }
  }
  
  func voiceClient(_ client: VGVoiceClient, didReceiveInviteCancelForCall callId: String, with reason: VGVoiceInviteCancelReason) {
      DispatchQueue.main.async { [weak self] in
          self?.dismiss(animated: true)
      }
  }
  
  func voiceClient(_ client: VGVoiceClient, didReceiveHangupForCall callId: String, withQuality callQuality: VGRTCQuality, reason: VGHangupReason) {
      DispatchQueue.main.async { [weak self] in
          self?.callID = nil
          self?.connectionStatusLabel.text = "Call Ended"
      }
  }
}

を実装することもできます。 didReceiveHangupForCall このデリゲート関数は、通話が切断されたときに呼び出される。

注: また、前のステップで構築したウェブフック・サーバーがまだ稼働していることを確認してください。

プレス Cmd + R をビルドして再度実行すると、先ほどのアプリケーションにリンクされた番号に電話をかけると、アラートが表示されます。電話に出れば、通話はつながります!

Incoming call alert

ウェブフック

通話を続けながら、端末に切り替えてください。 /voice/answer NCCO を取得するために呼び出されるエンドポイント:

NCCO request:
  - caller: 441234567890

また、通話がさまざまな段階を経て進むにつれて、 /voice/event が送られる:

EVENT:
{
  headers: {},
  from: '441234567890',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'ringing',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:05.582Z'
}
---
EVENT:
{
  headers: {},
  from: '441234567890',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'started',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:05.582Z'
}
---
EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: '441234567890',
  to: '442038297050',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'answered',
  direction: 'inbound',
  network: null,
  timestamp: '2021-03-29T21:20:06.182Z'
}
---
EVENT:
{
  from: '441234567890',
  to: 'Alice',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'started',
  direction: 'outbound',
  timestamp: '2021-03-29T21:20:13.025Z'
}
---
EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: '441234567890',
  to: 'Alice',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'answered',
  direction: 'outbound',
  network: null,
  timestamp: '2021-03-29T21:20:13.025Z'
}
---
EVENT:
{
  headers: {},
  end_time: '2021-03-29T21:20:16.000Z',
  uuid: '944bf4bf-8dc7-4e23-86b2-2f4234777416',
  network: null,
  duration: '5',
  start_time: '2021-03-29T21:20:11.000Z',
  rate: '0.00',
  price: '0',
  from: '441234567890',
  to: 'Alice',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'completed',
  direction: 'outbound',
  timestamp: '2021-03-29T21:20:17.574Z'
}
---
EVENT:
{
  headers: {},
  end_time: '2021-03-29T21:20:18.000Z',
  uuid: '0779a56d002f1c7f47f82ef5fe84ab79',
  network: 'GB-FIXED',
  duration: '12',
  start_time: '2021-03-29T21:20:06.000Z',
  rate: '0.00720000',
  price: '0.00144000',
  from: ' 441234567890',
  to: '442038297050',
  conversation_uuid: 'CON-8f5a100c-fbce-4218-8d4b-16341335bcd6',
  status: 'completed',
  direction: 'inbound',
  timestamp: '2021-03-29T21:20:17.514Z'
}
---