スクリーンショット_2019-06-27_9

iOSでCallKitとWebRTCを使ってビデオ通話アプリを作る

こんにちは、依藤です。CallKitとWebRTC(SkyWay)を使ってiOS用のビデオ通話(VoIP)アプリを作ったときに調べた情報をまとめてみました。

この記事では具体的なコードは出てきません。「iOSでビデオ通話アプリを作る時に必要な技術要素って何だろう」と思っている方の参考になればと思います。コードを交えた解説は別の記事で書けたらと思います。

CallKitとは

CallKit は WWDC 2016 で発表された iOS 10 以降で利用できる標準ライブラリです。iOSの標準の電話で利用されているUIをアプリに組み込むことができます。

CallKitが登場する前もVoIPアプリは存在していました。CallKitを使うメリットは、標準の通話アプリと同じUX/UIを利用できることと、ロック中でも着信に応答できることです。

また、iOSの「おやすみモード(Do Not Disturb)」の状態に応じて自動的に挙動がコントロールされるようになっていますので、電話を受けたくない時などに各アプリごとに着信拒否の設定をする必要がありません。着信履歴は標準の電話アプリの履歴に残すことができます(アプリ側の実装で残さないようにすることもできます)。履歴からアプリを呼び出してコールバックすることも可能です。

CallKit は iPad にも対応しています。iPadには標準の電話アプリは提供されていませんが、CallKitを使ったアプリは利用できます。

アプリからCallKitを使う際には機能を細かく制御することができます。

例えば

・ビデオ通話を利用する・しない

・グループ通話(3人以上での通話)

・保留機能(キャッチホン、通話中に別の着信に応答する)

などがあります。これらをアプリの要件に合わせて使い分けることができます。ただし、CallKitではこれらを制御するUIを提供しますが、実際の機能は各アプリで作りこむ必要があります。

具体例として保留機能を考えてみます。通話中に別の着信がきたとき、

・現在の通話を一旦切断して着信に応答する

・保留状態にして着信に応答する

の2通りが考えられます。保留機能を有効にすると後者が実現できるわけですが、保留にした通話について保留音(メロディーなど)を流したり、二つの通話を内部的に管理するのは全てアプリ側で実装する必要があります。機能を有効にすると便利になりますがその分の実装コストは高くなります。CallKitはあくまでUX/UIを提供してくれるにすぎません。

CallKitを使うことで電話アプリを作れることはわかりました。CallKitはあくまで通話UX/UIを提供するためのフレームワークで、実際にVoIPアプリを実現するためには、発信着信などの機能を各アプリで実装する必要があります。発信や着信を実現する際に使われるのが後述する PushKit です。

PushKitとは

PushKit はVoIPアプリなどでの利用を想定したプッシュ通知です。標準のプッシュ通知と比べて以下のような特徴があります。

・PushKit 通知を受信するとアプリが起動していなくても自動的にアプリを起動します(バックグラウンドで起動)

・バックグラウンドで一定時間処理を行う猶予が与えられる(この間に必要な通信などを行います)

・標準的なプッシュ通知よりも多くのデータを含めることができます

・通知の配信優先度が高く設定できます(どれくらい効果があるのかは比べていません)

以下のサイトにVoIP向けプッシュ通知の特徴がまとめられています。

こちらに日本語でまとめている方がいます。

アプリが起動していなくてもバックグラウンドで起動されるので、通常のプッシュ通知のように

・通知を受信 --> ユーザーが操作 --> (ロック解除) --> アプリが起動

ではなく、

・通知を受信(PushKit) --> バックグラウンドでアプリが起動  --> 必要な処理を実行

という挙動を実現することができます。

PushKit 通知を送信するためにはAPNsのサーバに対してデータを送る必要があります。データの送り方は標準の通知とほぼ同じです。

PushKit を使うことで電話の発信や着信が実現できます。着信した後の通話を実現するにはビデオや音声をネットワーク越しにやり取りする必要があります。CallKit/PushKit にはそのような機能はありませんので各アプリで実装する必要があります。これを手軽に実現することができる仕組みが次に紹介する WebRTC です。

WebRTCとは

WebRTCはWeb Real-Time-Communicationの略で、Webブラウザ(ChromeやFirefoxなど)で音声・映像・データなどのリアルタイム通信を行うための仕組みです。アプリやプラグインなどをインストールすることなくブラウザからビデオ通話などを利用することができます。ビデオ通話に必要な通信の仕組み、映像・音声コーデック、API、その他諸々が用意されています。

WebRTCのコア技術はブラウザ以外の環境でも利用することが可能ですが、iOSの標準ライブラリのような手軽さでアプリに組み込むことはできないようです。また、端末同士が接続する際にサーバーなどの用意が必要になることがあります。

ここ数年、色々な企業・ベンダーから、WebRTCを簡単に利用することができるフレームワーク・ライブラリ・サービスが登場しています。個人的に「WebRTCのマネージドサービス」と呼んでいますが、これらを使うことで少ない手間で簡単にWebRTCを利用することができます。

SkyWay

SkyWayはNTTコミュニケーションズが提供しているWebRTCのプラットフォームです。SkyWayを使うとWebRTCの機能を簡単に利用することができます。

私がSkyWayを使う理由は

・無料で使い始められる

・ブラウザ(Web)、iOS、Android向けのSDKが提供されている

・WebRTCの利用に必要なサーバーなどがクラウドで提供されている

・定期的にアップデートしてブラウザの仕様変更等に追従している

・サンプルコード、チュートリアルが充実している

・日本語のドキュメントがわかりやすい

などです。

iOS向けのSDKはCocoaPodsなどを使ってアプリに組み込むことできます。チュートリアルやサンプルコードなども提供されているので、数時間程度の作業でWebRTCを使ったビデオ・音声の通話機能が作れます。

VoIPアプリで利用する際には、まずPushKitを使って通話したい相手にお互いがWebRTCで接続するために必要な情報を送ります。その情報を使ってWebRTCでの接続を試み、成功したらビデオや音声のやり取りを行います。

まとめ

CallKit:電話UX/UI

PushKit:発着信

WebRTC:ビデオ・音声のやり取り

これらを組み合わせることでVoIPアプリに必要な技術要素は揃いました。

記事の内容への質問、疑問、誤りなどがありましたらツイッター(https://twitter.com/yorifuji)までご連絡いただけると幸いです。


(2019.8.22 追記)

SkyWayUGで発表した資料をアップロードしました(サンプルコード付き)


この記事が気に入ったらサポートをしてみませんか?