Swift

電話をかける

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

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

の無効性に基づく。 callID プロパティは callButtonPressed メソッドは、通話を開始するときにも終了するときにも使えるようになりました。 placeCall そして endCall メソッドがそれぞれのケースでトリガーされる。

現在の callButtonPressed メソッドに以下のコードを追加する:

@IBAction func callButtonPressed(_ sender: Any) {
    if callID == nil {
        placeCall()
    } else {
        endCall()
    }
}

func placeCall() {
    callButton.setTitle("End Call", for: .normal)
    client.serverCall(["to": "PHONE_NUMBER"]) { error, callId in
        DispatchQueue.main.async { [weak self] in
            guard let self else { return }
            if error == nil {
                self.callID = callId
            } else {
                self.callButton.setTitle("Call", for: .normal)
                self.connectionStatusLabel.text = error?.localizedDescription
            }
        }
    }
}

func endCall() {
    guard let callID else { return }
    client.hangup(callID) { error in
        DispatchQueue.main.async { [weak self] in
            guard let self else { return }
            if error == nil {
                self.callID = nil
                self.callButton.setTitle("Call", for: .normal)
            }
        }
    }
}

電話をかける際 callServer 関数が呼び出される。この関数は、辞書内の情報(この場合は着信者番号)をWebhookサーバーに渡します。Webhookは、Vonageに通話を接続する相手を伝える通話制御オブジェクトを返信します。通話を終了するときに hangup 関数が呼び出され、成功すれば callID はゼロに設定される。

注: 必ず交換してください。 PHONE_NUMBER の下に、実際に電話をかけたい電話番号をE.164形式で入力してください(例:447700900000)。また、前のステップで構築したウェブフック・サーバーがまだ稼働していることを確認してください。

これだけです!これで、電話をかけ、かけ、かけることができる!マジック!電話がかかってきたら、応答してIn-App Voiceを聞くことができます。

ウェブフック

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

NCCO request:
  - callee: 447700900000

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

...
---
VOICE EVENT:
{
  from: null,
  to: 'Alice',
  uuid: '2da93da3-bcac-47ee-b48e-4a18fae7db08',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'started',
  direction: 'inbound',
  timestamp: '2021-03-10T10:36:21.285Z'
}
---
VOICE EVENT:
{
  headers: {},
  from: 'Alice',
  to: '447700900000',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'started',
  direction: 'outbound',
  timestamp: '2021-03-10T10:36:27.080Z'
}
---
...
---
VOICE EVENT:
{
  start_time: null,
  headers: {},
  rate: null,
  from: 'Alice',
  to: '447700900000',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'answered',
  direction: 'outbound',
  network: null,
  timestamp: '2021-03-10T10:36:31.604Z'
}
---
VOICE EVENT:
{
  headers: {},
  end_time: '2021-03-10T10:36:36.000Z',
  uuid: '8aa86e22-8d45-4201-b8d8-3dcd76e76429',
  network: '23433',
  duration: '5',
  start_time: '2021-03-10T10:36:31.000Z',
  rate: '0.10000000',
  price: '0.00833333',
  from: 'Unknown',
  to: '447700900000',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'completed',
  direction: 'outbound',
  timestamp: '2021-03-10T10:36:35.585Z'
}
---
VOICE EVENT:
{
  headers: {},
  end_time: '2021-03-10T10:36:35.000Z',
  uuid: '2da93da3-bcac-47ee-b48e-4a18fae7db08',
  network: null,
  duration: '15',
  start_time: '2021-03-10T10:36:20.000Z',
  rate: '0.00',
  price: '0',
  from: null,
  to: 'Alice',
  conversation_uuid: 'CON-1a28b1f8-0831-44e6-8d58-42739e7d4c77',
  status: 'completed',
  direction: 'inbound',
  timestamp: '2021-03-10T10:36:36.187Z'
}

注: 通話が完了すると、イベントには通話時間と料金の情報も含まれる。