目標
Twilio を使って、LINE のようなアプリ内通話を実現したい!
※まだ設計段階なので、見落としている部分があるかもしれません。その時は適宜修正, 更新します。
登場人物
通話を実現するには以下のものが必要
- Device A (発信側)
- Device B (受信側)
- API (自社サーバ)
- Twilio
概略図
以下にそれぞれの流れを整理する。
1, AさんがBさんへ通話ボタンを押す(Aさんアプリ内)
その瞬間、APIへ接続する。
2, APIがTwilioと接続し、AさんとBさんそれぞれのケーパビリティトークンを取得
ケーパビリティトークンというのを利用し、各端末は電話を発信したり受信したりできる。そのため電話するにはこれを発行する必要がある。
Aさん用のケーパビリティトークンは、AccountSid, AuthToken, AppSid の3つを指定して生成する。AppSid は Twilio サービス内のTwiMLAppのidで、音声通話URLと連動している。これが5と関わる。
Bさん用のケーパビリティトークンは、AccountSid, AuthToken, ClientName の3つを指定して生成する。ClientName は5で電話のかけ先に使うための識別子だ。通話の毎にユニークになればいいっぽい。
3, Aさん、Bさん端末へケーパビリティトークンを送信
Aさんに対してはAPIのレスポンスという形でケーパビリティトークンを返せば良いだけ。
Bさんに対してはプッシュ通知でケーパビリティトークンを送信する。ここがやや面倒。
4, 受け取ったAさんBさんそれぞれの端末で通信(connect)
ケーパビリティトークンがそれぞれの端末で取得できれば、それを使ってTwilio クライアント SDKにある Device
を作成することができる。
発信側のAさん端末で connect() を呼ぶと、Twilio サーバ側で AppSid に紐づいた 音声通話URL へリクエストを投げる。このリクエストの向き先を自分の所のAPIへリクエストを投げるように設定する。これはTwilioの管理画面から設定する。下の音声通話の部分。
Bさんの方もプッシュ通知を受け取ったら、Device
を登録しておく。また、受信時の起動アクティビティを登録しておく。
5, Twilioから受けたリクエストを TwiML で返す
AさんからTwilioへ接続する際に、Bさんのケーパビリティトークンを生成する時に使ったClientNameを付与して送信する。自分のサーバでは<Dial>の<Client>
タグを生成し、その中に送られてきたClientNameを表示する。そうするとTwilioはBさんへ電話をかけてくれる。
6, 受信画面を表示
うまくつながれば、BさんのDevice登録時に指定した受信時のアクティビティが起動されるはずだ。