web-dev-qa-db-ja.com

iOSアプリは、バックグラウンドにある間、TCP接続を無期限に存続させるにはどうすればよいですか?

TCP経由でリモートサーバーに接続するiPhoneアプリ。使用シナリオは次のとおりです。

  1. アプリ(ユーザー)はサーバーにデータを送信し、サーバーはデータを返信します。
  2. サーバーは何もしない間にアプリにデータを送信する場合があります。

アプリが30分​​間サーバーにデータを送信しない場合、サーバーは接続を閉じます。ユーザーが何もしなくても、120分間接続を維持します。

ケース1:アプリがフォアグラウンドにある場合、タイマーを使用して何もしないデータをサーバーに送信できます。問題ない。

ケース2:ユーザーがホームを押してアプリがバックグラウンドになった場合、どうすればよいですか?アラートやユーザーの邪魔をするもの(彼が不在またはゲームをプレイしている)を表示したくありません。接続をより長く維持したいのですが、ユーザーがアプリに戻ったとき、彼は接続がまだ生きており、それに満足していることを知りました。

バックグラウンド実行、マルチタスク、およびiphone APIのローカル通知に関するドキュメントを読みました。 ケース2を達成できるかどうかはわかりません

正当なAPIのみを使用し、ジェイルブレイクはしません。

42
yehnan

Tapbotsは、Pastebotでこの問題を解決するために、ユーザーに サイレントバックグラウンドオーディオトラック を常に実行するように促しています。

AppleバックグラウンドオーディオやVOIP APIを使用して非オーディオアプリやVOIPアプリを実行し続けるなどのハックを使用することに眉をひそめることに注意してください(上記の記事で説明した「回避策」から明らかです)テクニックは、提出の時点で拒否されるリスクがあります。

ただし、残念ながら、バックグラウンドで接続を維持するための正当なAPIはありません。おそらく、iOSの将来のアップデートでそれらを導入するかもしれませんが、 機能リクエスト を送信して、サポートを表明することを検討するかもしれません。

24
Nick

AppleのiOSアプリケーションプログラミングガイドの VoIPアプリケーションの実装 をご覧ください。これはテスト済みのソリューションではありませんが、あなたが求めているものを達成するために使用できると思います。

VoIPアプリケーションの実装

Voice over Internet Protocol(VoIP)アプリケーションを使用すると、ユーザーはデバイスの携帯電話サービスの代わりにインターネット接続を使用して電話をかけることができます。このようなアプリケーションは、着信サービスやその他の関連データを受信できるように、関連するサービスへの永続的なネットワーク接続を維持する必要があります。 VoIPアプリケーションを常にアウェイク状態に保つのではなく、システムはそれらを一時停止させ、ソケットを監視する機能を提供します。 着信トラフィックが検出されると、システムはVoIPアプリケーションを起動し、ソケットの制御をそれに戻します。

VoIPアプリを開発しているかどうかはわかりませんが、ソケットにアクセスして、着信パケットに反応することができます。引用符の後のテキストは[setKeepAliveTimeout:handler:][2]を参照します。これにより、コードのブロックを設定して、(VoIP)接続を維持できます。ただし、最小スケジューリング時間は10分です。

VoIPアプリケーションの実装では、キープアライブハンドラーのインストールに関する段落があります。これが役立つかどうか興味があります。これで問題が解決した場合は、お知らせください。

15
Nick Weaver

1.このようなVOIPプロパティでソケットを作成します

[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

[outputStream  setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

2. app.plistで「アプリがVoice over IPサービスを提供する」として必要なバックグラウンドモードを追加します。

アプリケーションがバックグラウンドモードの場合、voipソケットは閉じません。取得できるuilocal通知でこのソケットを使用します。

「アプリケーションが元のvoipアプリケーションでない場合、アプリストアは拒否します」

5
Gowtham R

アプリがフォアグラウンドにある場合:

STOMPをご覧ください http://stomp.codehaus.org/Protocol

Obj-CのSTOMPフレームワーク http://code.google.com/p/stompframework/

およびActiveMQブローカー http://activemq.Apache.org/

アプリがバックグラウンドにある場合は、おそらくAPNS(通知)を使用して、ユーザーにアプリを復帰させるように促します...

3
adam