SIP プロトコルを使用する VOIP アプリケーションを実装しています。SIP に従って、一定の間隔で SIP サーバーへの登録を更新する必要があります。しかし、アプリがバックグラウンドになると、キープアライブ ハンドラーは Apple のドキュメントに従って 600 秒後にのみ呼び出されます。しかし、これは SIP プロトコルでは望ましくありません。サーバーとの接続を維持し、着信を受信できるようにするには、アプリがバックグラウンドであっても、600 秒前に登録メッセージを送信する必要があります。Apple のドキュメントによると、これは不可能ですが、登録間隔が 60 秒の場合でも、バックグラウンドで実行され、SIP サーバーへの登録を維持するアプリを AppStore で見たことがあります。彼らはずっとアプリをバックグラウンドで実行し続けます。では、これはどのように可能ですか?バックグラウンドで無音のオーディオを再生しても存続することはわかっていますが、AppReview プロセスはそれを拒否します。しかし、もしそうなら、Apple はどのようにして AppStore で他のそのようなアプリを許可したのでしょうか? 私が上で説明したことを達成するための標準的な方法はありますか? どんな助けでも大歓迎です。
1 に答える
登録を頻繁に送信する必要はありません。次のようなことができます: TCP 接続を開いたままにするために、キープアライブ パッケージを sip クライアントに送信するようにサーバーを構成します。サーバーはTCP接続をサポートし、クライアントはTCP経由で通信する必要があります.Appleはバックグラウンドモードで非常に制限的であり、TCP接続のみがバックグラウンドで開いたままにすることが許可されているためです(TCPソケットがCFReadStreamRefでラップされている場合)。
問題は登録メッセージではありません。これは、クライアントが接続試行間の時間を指定することで構成できます。sip サーバーは、2 つの登録メッセージの間に 1 時間の間隔があれば問題ありません。本当の問題は、着信コールまたは IM の場合にサーバーが sip クライアントにどのように連絡するかです。ほとんどの sip クライアントはパブリック IP アドレスを持っていませんが、ほとんどの場合、NAT の背後にあります。そのため、sip サーバーが sip クライアントへの直接接続を開く方法はありません。このため、クライアントとサーバーの間でソケットを開いたままにしておく必要があります。
アプリストアのどのアプリも、600 秒以上の頻度で登録メッセージを送信していません。
sip に独自のライブラリを使用していますか、それとも pjsip を使用していますか? pjsip を使用すると、さらにヒントを得ることができます。どの SIP サーバーを使用する予定ですか?
いくつかのヒント:
app-info.plist で、必要なバックグラウンド モードを「アプリは Voice over IP サービスを提供する」および「アプリは音声を再生する」に設定していることを確認してください。
アプリが独自の sip サーバーに関連付けられていない場合は、ユーザーが allow_contact_rewrite pjsip パラメーターを無効にする方法を提供します (通常、nat の問題をバイパスするためにこれを有効にする必要があります)。一部のセッション ボーダー コントローラーはこれに満足していないためです。特徴
メインスレッドのsipスレッドから送信されたメッセージをキャプチャする場合は、メソッドを使用してそれらをメインスレッドに投稿していることを確認してください
ここでは、いくつかの他の興味深い問題について説明します
たくさんのコーヒーを用意してください :))