ボクココ

個人開発に関するテックブログ

iOS CallKit と Twilio Voice iOS 実装

ども、@kimihom です。

f:id:cevid_cpp:20210912142640j:plain

ここ半年くらいずっとやってきた CallKit を使った開発について、1つ記事にしてみよう。

参考

この4つが圧倒的に詳しく書かれているので、ほとんどは上記を読むだけで済むんだけど、少し追加した情報を紹介してみる。

CallKit の魅力

ブラウザでの WebRTC 実装が普通となりつつある今、なぜネイティブの CallKit で電話の発着信を実装すべきなのか。 これは、ズバリ "スマホをスリープさせても、着信が来たら通知が届く" という当たり前であるけど、実装が一番難しいことが 公式で提供されているからだ。スマート "フォン" として一般的な実装を iPhone 内でしたい場合には、現状 CallKit の利用が必須になっている。

仮に発信程度だけの用途で iPhone 利用する場合には、Twilio Voice JavaScript SDK を利用した方がいい。それなら PC・スマホどちらでも利用できるし、iOS CallKit のような複雑な設定や実装がいらなくなる。去年、Twilio Voice JavaScript SDK で Safari でまともに使えるようなアップデートがされている。

CXProvider

Call の管理をする CXProvider の設定で、CXProviderConfiguration を設定することで、着信時の表示を変えることができる。

    var audioDevice = DefaultAudioDevice()
    var voipRegistry: PKPushRegistry?

    func initClient() {
        let configuration = CXProviderConfiguration()
        configuration.maximumCallGroups = 1
        configuration.maximumCallsPerCallGroup = 1
        configuration.supportedHandleTypes = [.generic]
        configuration.supportsVideo = false
        configuration.iconTemplateImageData = UIImage(named:"IncomingIcon")?.pngData()
        configuration.ringtoneSound = "Ringtone.wav"
        
        callKitProvider = CXProvider(configuration: configuration)
        callKitProvider?.setDelegate(self, queue: nil)

        TwilioVoiceSDK.audioDevice = audioDevice
        
        self.voipRegistry = PKPushRegistry.init(queue: DispatchQueue.main)
        self.voipRegistry?.delegate = self
        self.voipRegistry?.desiredPushTypes = Set([PKPushType.voIP])
    }

ここで、執筆時点で最新の ドキュメントでは、CXProviderConfiguration(localizedName: "Hello") のような設定が Deprecated になっている。じゃあ着信の時の名前表示はどこでするのかというと、iOS アプリ自体の TARGETS > Identity > Display Name がその表示となる。現状のドキュメントではこのことが一切書かれておらず、Stackoverflow で回答をゲットできた。

上記で 2つの delegate を実装する必要があることがおわかりだろう。CXProviderDelegate と、 PKPushRegistryDelegate だ。しっかりとドキュメントを読んでその通りに実装する必要がある。

他にどんなこと書こうかを考えたけど、一般的な内容は上記リンク先に全て書いてあるし、それ以外は独自実装の話になってくるので一般的な記事にもしづらかったm

保留やキューイング処理実装

「通話を保留して、他の方のスマホや PC で取り次ぎたい」これは PC であっても スマホであっても確実に電話で欲しくなる機能だ。

これを実装するには、Twilio Voice iOS SDK だけでは難しい。私の場合、Twilio が提供している Twilio Sync iOS を使うことで、現在 保留にいる相手情報やコール詳細の共有を実現している。基本的な考え方は JavaScript や REST API をいじってたので、それを iOS で動くように翻訳することで、実装することができた。Twilio Sync 周りは Web でかなり経験を積んできての iPhone アプリ実装だったので問題にはならなかった。

ここで言えるのは、PC で実現できることはスマホでも実現できるよ。それだけだ。

終わりに

CallKit と Twilio Voice を組み合わせることで、電話回線との契約が不要で、誰もがアプリをインストールするだけで iPhone 上で電話ができる。一般的な携帯電話会社との契約(SIM)が不要で、しかもどの iPhone でも情報を共有できる。

リモートワークが一般になった今、そんな共有アプリが必要とされているだろう。ビジネス利用での共有電話(コールセンター) iPhone アプリを楽しみにしておいてほしい。