8

私はメッセージングアプリに取り組んでおり、サーバーからクライアントにデータを送信する方法についてジレンマを抱えています。

クライアントがサーバーにメッセージを送信するために使用する集中サーバー設計を使用NSURLConnectionしています。サーバーは開いているソケットを保持および管理せず、クライアントの1つにメッセージを送信できません。そのため、クライアントはタイマーを使用して 2 秒ごとにサーバーにクエリを実行し、新しいデータが待機しているかどうかを確認します。

このアプローチの問題は、2 秒ごとにサーバーをポーリングするとバッテリーが非常に速く消耗するように見えることです。そのため、クライアントがサーバーをポーリングする代わりに、APNS* を使用することを考えまし。サーバーは* ** クライアントにプッシュ通知 を送信し、クライアントはサーバーからデータを取得します。

* APNS を使用- クライアントが許可する場合、クライアントはもちろんこのオプションを無効にすることができます。そのため、アプリがフォアグラウンドに入るたびにプッシュが許可されているかどうかを確認し、許可されていない場合はポーリング アプローチに戻ります。

** 新しい情報は、テキスト メッセージからサーバー管理メッセージまで、何でもかまいません。(そして管理者メッセージがたくさんあります...)
たとえば、私のアプリでは、ユーザーは自分の友達のステータス (オンライン/オフライン) を見ることができるので、user1 と user2 が友達で、user2 がオンラインからオフラインにステータスを変更した場合、次に、サーバーはこの新しい情報 (管理者メッセージ = user2_offline) を user1 に送信する必要があります。

*** プッシュ通知サーバーの送信は空です (データ/サウンドなし)。これは、クライアントが新しい情報をフェッチするための単なるトリガーであるため、プッシュがクライアントに送信され、クライアント アプリが閉じられた場合、彼はそうしません。何にでも気づく。(アプリが実行中の場合、サーバーから新しい情報を取得します)

このアプローチは、大量のプッシュ通知の使用を必要とする大規模なメッセージング アプリで機能しますか?

より明確にするために、私の主な関心事は次のとおり
です。
2. Apple は、サーバーからの 1 日に数千または数十万のプッシュ通知を承認しますか?

4

2 に答える 2

-1

私はしばらくこの分野で働いてきましたが、私の控えめな経験から、問題を解決するためのあなたのアプローチはどこにも届かないと思います. 最初に、APN の特性に関するいくつかの重要な事実を強調させてください。

  1. APN は信頼性が低く、クライアントに到達することが 100% 保証されているわけではありません。
  2. Apple のドキュメントの時点では、APN はベスト エフォートであるため、到達できない場合が多くあります。
  3. APN は内部にデータを保持しないため、クライアント アプリに到達したとしても、アプリのデータは内部に何も保持しません。
  4. APN は、アプリに関連する何かが発生したことをユーザーに通知するだけであり、メッセージ (APN のアラート ボックスに表示されるテキスト) はアプリではなく iOS によって処理されます。これが、iOS 4 を搭載したデバイスが iOS 5 を搭載したデバイスとは異なる方法で APN を表示する理由です。これはアプリではなく OS の仕事です。
  5. 通知が来たときにアプリ アイコンに表示されるバッジの値は、デバイスの OS ではなく、サーバーの責任です。別の言い方をすれば、APN がデバイスに到達すると、アプリの新しい通知カウント値を取得する必要があります。OSはこれに対して何もしません。

そうは言っても、通常、そのようなアプリケーションがどのように設計されているかを少し説明したいと思います。まず、URL 接続では行われず、クライアントは定期的にサーバーをチェックしません。通常、クライアントがデバイス上のアプリであり、サーバーがサーバー マシン上に存在する実際のサーバー プログラムであるクライアント/サーバー アーキテクチャがあります。サーバーは、Microsoft (たとえば C# を使用) または MAC (Objective C を使用) である可能性があります。サーバーには、内部に情報を格納するデータベースがあります。いくつかの重要な情報 (質問に関連する) は、APN カウント値、配信するメッセージ、オンラインまたはオフラインの場合のクライアントの状態です。

クライアントが別のクライアントに何かを送信したい場合、またはサーバーがクライアント (またはすべてのクライアント) に何かを送信したい場合、受信者のクライアントがオンラインかオフラインかを確認するためにチェックが行われます。彼がオンラインの場合、メッセージは直接送信され、通常、通信は TCP ソケットで行われます。ユーザーがオフラインの場合、サーバーはクライアントに送信する必要があるメッセージを保存し、APN カウント値を増やして、その受信者に APN を送信します。その受信者がオンラインになると、サーバーはそれを認識し(接続とハンドシェイクが確立されているため)、データベースからすべての未配信メッセージを取得して送信します...

長いプロセスです。少し説明できれば幸いです。すべての場合において、あなたの方法が実際的であるとか、実際の仕事に到達できるとは思いません。

于 2012-06-10T13:06:39.767 に答える