よくあるお問い合わせ (FAQ)

Twilioクライアント iOS SDK バックグラウンド動作のベストプラクティス

ここでは、クライアントアプリケーションがバックグラウンド時に、TwilioクライアントiOS SDKがスムーズに動作するようアプリケーションの設定や実装を行いたい開発者向けの、Twilio社で推奨されるベストプラクティスをご紹介します。

アプリケーション設定

XcodeでiOSアプリケーションのプロジェクトを開き、プロジェクト設定内の "Capabilities" にて、 “Voice over IP” および “Audio, AirPlay and Picture in Picture” を有効にします。

setKeepAliveTimeout:handler: API

アプリケーションがiOSのバージョンが8.0未満で動作する場合、モバイルクライアントとTwilioサービス間の接続を維持することを確実にすべく、アプリケーションが600秒ごとに復帰できるよう自身を登録するために、TwilioクライアントiOS SDKは UIApplication クラスを使用します。 このAPIによって、iOSは(アプリの)単一インスタンスのみが登録されることが保証される [英語] ため、ここでは煩雑な処理は (Twilio) SDKに任せ、開発中アプリケーションのロジックに自前でこの処理を追加しないようにしてください。

iOS 8以降では、VoIP Best Practice by Apple [英語] を参照してください。 アプリが着信接続を受信したい場合、プッシュ通知をモバイルクライアントに送信することにより、アプリケーションが着信要求を受けるか、それが有効でない場合に接続を確立するため、VoIPベースのアプリケーションにVoIPサービスとモバイルアプリケーションとの間の接続が有効であることを確実にするための十分な時間が確保されます。

開発中のアプリケーションがiOS 8.0以降で動作する場合、VoIPサービスに登録するために setkeepAliveTimeout:handler APIに依存する代わりに、Apple社はVoIPアプリケーションが registerForRemoteNotifications 通知に登録することを推奨しています。 なお、 setkeepAliveTimeout:handler APIはiOS 9.0で非推奨となったものの、このAPIの使用はリンク時や実行時のエラーを引き起こしません。 とはいえ、いずれこのAPIは廃止されるでしょう。

アプリケーションにローカル通知を追加する

VoIPアプリケーションが常に前面でアクティブであるとは限らずとも、着信通話には応答したいでしょう。 でもどうやってこれを達成するのでしょうか。 device:didReceiveIncomingConnection: デリゲートメソッドで、 UILocalNotification のインスタンスを作成し、すぐにそれを呼び出します。

- (void)device:(TCDevice *) didReceiveIncomingConnections:(TCConnection *)connection {
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Incoming Call";
notification.fireDate = [NSDate date];
NSArray *oldNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
if ([oldNotifications count] > 0) {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}

[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}

アプリケーションがバックグラウンド時に接続が期限切れになったら?

iOS 8.0以降でのVoIPアプリケーションにおけるApple社のベストプラクティスでは、プッシュ通知 (PushKit)を使用することが推奨されていますが、これは残念ながらTwilioクライアント基盤、およびSDKでサポートされていません。 これを踏まえて、クライアントアプリケーションが接続を維持する最善の方法は、バックグラウンドでケイパビリティ・トークンが期限切れになったときに、エンドユーザーがアプリケーションを再度開き、新しいケイパビリティ・トークンを生成して (Twilio) サービスに再登録できるよう、 UILocalNotificationを呼び出すことです。

アプリケーションがバックグラウンド時でもなお、TwilioクライアントSDKの接続を維持する方法

アプリケーションがバックグラウンド時でも確実に着信通話を受けられるよう、Twilioサービスとアプリケーションが接続を維持するため、モバイルクライアントはTwilioクライアントSDKに依存します。

さらに、TwilioクライアントSDKは UIApplication クラスの setKeepAliveTimeout:handler: APIを使用してハンドラーを登録します。 アプリケーションがバックグラウンドになることをSDKが検出すると、iOSががアプリケーションをサスペンド状態から10分ごとに復帰させるよう、600秒のタイムアウト値をともない、このAPIを使用します。 そしてSDKはケイパビリティ・トークンがまだ期限切れでなければ、アプリケーションの復帰時間を使って接続を更新します。

接続が切断されたときにモバイルクライアントを「接続」状態に戻す方法

ケイパビリティ・トークンが期限切れになったり、ネットワーク品質が低下すると、モバイルクライアントは(サーバーから)リーチ不可能になり、その結果、着信要求を受けることができなくなります。 着信接続のためのリスニングが停止すると、SDKは device:didStopListeningForIncomingConnections:デリゲートメソッドを介してアプリケーションに通知します。 以下は、デリゲートコールバックで接続を復帰させる方法を示すサンプルになります。

- (void)device:(TCDevice *) didStopListeningForIncomingConnections:(NSError *)error {
if ([self _isCapabilityTokenValid] && self.device) {
/*
* TCDevice インスタンスとケイパビリティ・トークンが有効なら
* `listen`メソッドを呼び出す
*/
[self.device listen];
}
else {
/*
* 新たなケイパビリティ・トークンを生成し、TCDeviceを設定、更新する
*/
[self _setupTwilioClient];
}
}

プッシュ通知の有効なアプリケーションの場合は、発信側が着信側へのリーチに失敗した、たとえば受信側のケイパビリティ・トークンが期限切れになったり、ネットワーク品質が低下したりしたときにプッシュ通知を着信側に送ることができます。

他にご質問がございましたら、リクエストを送信してください

0 コメント

記事コメントは受け付けていません。