モバイル向けガイドライン — iOS

このトピックでは、iOSデバイス向けのアプリ開発を行う際の考慮事項について解説します:

背景状態の管理

iOSではすべてのアプリでマルチタスクがサポートされていますが、OpenTok iOS SDKをさまざまなアプリの状態において適切に動作させるためには、開発者がいくつかの手順を踏む必要があります。このドキュメントでは、ほとんどのOpenTokアプリで有効であることが確認されている一連のベストプラクティスについて解説します。ただし、これは アップルのドキュメント このテーマについて――具体的には、「アプリの状態遷移への対応策」、「バックグラウンド実行」、「VoIPアプリ開発のヒント」の各セクション。 Appleは、ほとんどのOpenTokアプリをVoIPアプリとは見なしていませんが、オーディオセッションの設定やソケットの設定に関する内容は、このドキュメントを理解する上で関連性が高く、有用です。

クイックスタート - アプリのアクセス許可を設定する

アプリがバックグラウンドでオーディオを録音し続けるようにするには、Xcodeでアプリのターゲットを選択し Signing & Capabilities タブをクリックします。次に、+ Capabilityボタンをクリックし、Background Modesケイパビリティをプロジェクトに追加します。次に Audio, Airplay, and Picture in Picture オプションで設定できます。この設定により、バックグラウンドでのオーディオ再生・録音中にアプリがサスペンド状態に移行するのを防ぐこともできます。

電話アプリのネイティブUIを使用して、着信時にアプリを起動させたり、保留イベントを通知したりする優先度の高いプッシュ通知が必要な場合は、以下を選択します。 Voice over IP XCodeの機能です。

OpenTokがバックグラウンドでできること(およびできないこと)

OpenTok SDK を使用するアプリ バックグラウンドの状態で、以下のことを行う:

  • OpenTokセッションをアクティブな状態に保ちます。
  • オーディオのみのセッションを持続する。
  • パブリッシャーと購読者にオーディオ/ビデオフラグを設定する。例えば OTPublisher.publishAudio プロパティ YES が許される。
  • カメラを取得しないカスタム ビデオ キャプチャ実装でパブリッシュする(たとえば、ファイルまたは合成されたビデオ ソースからパブリッシュする)。

アプリがアクティブ状態に戻り次第、カメラの使用を再開できます。

しかし、アプリ できない バックグラウンドの状態で次のことを行う:

  • カメラを出版社のビデオソースとして使用する。
  • OpenTokのストリームからの動画を使用して、新しいビューを設定します。
  • 電話やFaceTimeの着信があっても、アクティブなオーディオセッションを維持します。
  • 他のアプリがシステムオーディオリソースを取得するのを防ぎます。
  • アクティブなパブリッシャーやサブスクライバーがいない場合でも、OpenTokセッションへの接続を維持します。

バックグラウンドで実行中の OpenTok セッション

上記の設定により、アプリがバックグラウンド状態にある場合でも、OpenTokセッションをアクティブに維持することができます。これは、エンドユーザーがホームボタンを押したり、画面をロックしたり、別のプロセスでURLコンテンツを開いたりした結果であると考えられます。この audio この権限を付与すると、オーディオセッションがアクティブな場合、アプリプロセスはバックグラウンドでもサスペンド状態にならずに維持されます。つまり、他のプロセスがオーディオリソースを要求しない限り、OpenTokセッションでのオーディオのキャプチャおよびレンダリングを継続することができます。

iOSが正しく設定されている場合、アプリがバックグラウンドでアクティブなオーディオセッションを実行していることを示すインジケータが表示されます。これは、ステータスバーの背景が赤くなり、アクティブなオーディオセッションを保持しているアプリの名前(この場合はあなたのアプリ)を示す追加のバーが表示されます。

について Voice over IP 機能は、アプリケーション・サーバーとの長期間のシグナリング接続を維持するためのものである。

を選択した場合 Voice over IP 「Xcodeの機能」セクションでこのオプションを選択する場合、アプリはその機能にふさわしい機能を実装している必要があります。そうでない場合、App Storeの審査でアプリが却下される可能性があります。この機能は、音声や動画の通信に関係のない他の理由でアプリをバックグラウンドで実行し続ける目的には使用しないでください。

アプリケーションのイベント通知を受ける必要がある場合は、次のようにすることをお勧めします。 Appleプッシュ通知 を使用してアプリを起動し、ワークフローを実行します。アプリが着信コールを実装している場合は VoIPプッシュ通知.

コールキット

CallKit は、iOS アプリが OS との連携を強化できるようにするフレームワークであり、これによりアプリは以下のことが可能になります:

  • OSへの着信・発信を通知
  • VoIPプッシュ通知でアプリを起動(着信UIを表示したい場合のみ)
  • オーディオ・ルーティングの処理
  • 実行中のすべてのアプリ間のオーディオセッションを調整する
  • オーディオの出力レベルを向上させます
  • 通知画面およびネイティブの通話UIに通話操作ボタンを表示します

OpenTokでは、CallKitとの連携に2つの方法を提供しています:

  • を設定する。 CustomAudioDevice を制御する。 AudioSession アクティベーション参照 このサンプル.
  • を使用して通話サービスモードを有効にする。 OTAudioDeviceManager.currentAudioSessionManager().オーディオセッションマネージャーから返されたインスタンスは、オーディオセッションの設定と、オーディオセッションのアクティブ化と非アクティブ化に関するSDKへの通知に使用する必要があります。参照 このサンプル.

着信などのアプリケーションイベントについてアプリに通知が必要な場合、その実装は開発者の責任となります。以下の使用をお勧めします。 プッシュキット フレームワークと VoIPプッシュ通知. 参考として、以下を参照してください。 このサンプル.

OpenTokのネイティブ統合では、開発者がアプリの起動初期段階で「発信サービスモード」を有効にする必要があります。VoIPプッシュ通知を利用するには、 CXProvider.reportNewIncomingCall そうしないと、アプリがクラッシュする可能性があります。3秒以内に設定しないと、アプリがクラッシュする可能性があります。 CXAnswerCallAction コールバックが実行される。

呼び出しサービス・モードを有効にするには、アプリの application:didFinishLaunchingWithOptions: メソッドを使用する。

let sessionManager = OTAudioDeviceManager.currentSessionManager()
sessionManager?.enableCallingServicesMode()

を設定します。 AVAudioSession での CXStartCallAction または CXAnswerCallAction CXProvider コールバック。

ビデオ通話にはビデオチャットモードを、音声のみの通話にはボイスチャットをご利用ください。

sessionManager?.preconfigureAudioSessionForCall(withMode: .videoChat)
sessionManager?.preconfigureAudioSessionForCall(withMode: .voiceChat)

オーディオセッションのアクティブ化と非アクティブ化をセッションマネージャーに通知する。

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
	sessionManager?.audioSessionDidActivate(audioSession)
}
func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
	sessionManager?.audioSessionDidDeactivate(audioSession)
}

チェック CallKit開発者向けドキュメント をご覧ください。

コントロールを失う

電話やFaceTimeの着信は、アプリケーションを完全に中断させる最初のイベントです。このような場合、アクティブなオーディオセッションの有無に関わらず、アプリは中断されます。

オーディオセッションが別のプロセスに制御を譲ったためにアプリが一時停止した場合、これを処理するための追加のロジックは必要ありません。アプリが長期間一時停止された場合、OpenTokセッションへの接続は切断されます。そのセッションに接続している他のクライアントには、 connectionDestroyed イベントが発生し、アプリが中断されなくなると、最終的なクリーンアップが必要になります。コントローラがセッションのエラーと切断のデリゲートイベントを処理する限り、 これは自発的な切断ワークフローと変わりません。切断のクリーンアップが処理されると、クライアントは再接続できる。

プライバシー・マニフェストの設定

Vonage Video iOS SDK のバージョン 2.27.3、2.26.3、および 2.25.5 では、 AppleのApp storeが要求するプライバシー・マニフェスト. これらのバージョンのSDKを使用すると、以下の操作を行う際に、必要なプライバシー関連の設定が自動的に追加されます。 アプリのプライバシーレポートを作成する. 旧バージョンのVonage Video React Native SDKを使用する必要がある場合は、以下に基づいて必要なプライバシー設定を手動で追加することができます。 このファイルの設定 ご自身のアプリのプライバシーマニフェストファイルに。

中継セッションに影響するiOS 14のネットワーク変更

iOS 14で、アップルはローカル・ネットワーク・プライバシーを導入した。 このビデオ).

iOS 14 以降、アプリケーションが同じローカルネットワーク上のクライアントを購読しようとすると、オペレーティングシステムはユーザーに許可を求めるようになります。 中継セッション. 通知のデフォルトのテキストには、アプリが「ローカルネットワーク上のデバイスを検索して接続したい」と記載されています。

中継セッションでは、Vonage Video API は、可能な場合はローカルネットワークを利用して、ローカルネットワーク上のビデオ参加者を検出し、接続を行います。クライアントがローカルネットワーク上で接続できない場合、アプリケーションは OpenTok TURN サーバーを使用して、音声・映像ストリームを中継します。

ユーザーが権限を拒否した場合、クライアントが OpenTok TURN サーバーに接続できないと、サブスクライブの試行が失敗する可能性があります。この場合、権限が拒否された後、ユーザーが「設定」で権限を変更しない限り、同じネットワーク上のクライアントに対する今後のサブスクライブの試行もすべて失敗します。 残念ながら、iOS では、Applications がユーザーがこの権限を承認したか拒否したかを判別するための API は提供されていません。

なお、これは、 OpenTok メディアルーター、メディアはローカルネットワークではなくインターネット経由で送信されるため。

Applicationsでリレーされたセッションを使用する場合は、アプリケーションがこの権限を必要とする理由をユーザーに伝えるため、説明的なカスタム使用目的の文字列を追加することをお勧めします:

  1. Xcodeで、アプリのinfo.plistファイルを開く。
  2. info.plistエディターで、左側の列を右クリックして 行を追加 (または +)の設定を追加する。 プライバシー - ローカルネットワーク使用説明.
  3. この文字列の値を編集して、アプリがこの権限をどのように使用するかを説明してください。たとえば、「このアプリは、可能な場合、ローカルネットワークを使用して、同じネットワーク上のビデオ会議参加者を検出し、接続します。」と追加します。

ユーザーへのプロンプトには、この説明が含まれる。

ルーティングされたセッションを使用できず、ユーザーにローカルネットワークへのアクセス許可を求めるプロンプトを表示したくないApplicationsについては、以下のセクションに記載されているオプションのいずれかを使用できます。

ローカルネットワークのチェックをスキップしてメディア接続を確立する

を設定することができます。 OTSessionICEConfig.filterOutLanCandidates 以下のコードのように、アプリケーションがローカルネットワークを使用して接続を確立しないように強制するプロパティです。

オブジェクティブC

OTSessionSettings *settings = [[OTSessionSettings alloc] init];
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.filterOutLanCandidates = YES;
settings.iceConfig = myICEServerConfiguration;
session = [[OTSession alloc] initWithApiKey:kApiKey
                                   sessionId:kSessionId
                                    delegate:self settings:settings];

スウィフト

let settings = OTSessionSettings()
let myICEServerConfiguration = OTSessionICEConfig()
myICEServerConfiguration.filterOutLanCandidates = true
settings.iceConfig = myICEServerConfiguration
let session = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self,
                        settings: settings)

注: について OTSessionICEConfig.filterOutLanCandidates このプロパティは、OpenTok iOS SDK バージョン 2.30.0 以降で利用可能です。

TURNサーバーを使う

を設定することができます。 OTSessionICEConfig.transportPolicy 以下のコードのように、アプリケーションにTURNサーバーを使用して接続を確立させるように強制します。

オブジェクティブC

OTSessionSettings *settings = [[OTSessionSettings alloc] init];
OTSessionICEConfig *myICEServerConfiguration = [[OTSessionICEConfig alloc] init];
myICEServerConfiguration.transportPolicy = OTSessionICETransportRelay;
settings.iceConfig = myICEServerConfiguration;
session = [[OTSession alloc] initWithApiKey:kApiKey
                                   sessionId:kSessionId
                                    delegate:self settings:settings];

スウィフト

let settings = OTSessionSettings()
let myICEServerConfiguration = OTSessionICEConfig()
myICEServerConfiguration.transportPolicy = .relay
settings.iceConfig = myICEServerConfiguration
let session = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self,
                        settings: settings)

詳細情報

詳細については、以下を参照してください: