8

私はOBJ-Cの学習を始めたばかりですが、構築に向けて取り組んでいる最終目標のアプリがあります。このアプリはiPadのマスター/詳細アプリであり、「リアルタイム」でWebサービスを使用して更新を維持する必要があります。また、複数のユーザーの1人(別々のiPad上にいる)がアプリ内で特定のアクションを実行するときに、リモートのMySQLDBにデータを送信する必要があります。

編集:lxtが非常に役立つように明確にしたように、「Webサービスをポーリングするための手がかりとしてプッシュ通知を使用するのは適切ですか」-答えは一種です。

この質問の目的で私が想像した例は、テーブルビューに流れる「受信」在庫と、ユーザーが詳細ビューで在庫をドラッグアンドドロップする「在庫保管箱」を持つウィジェット在庫マネージャーです。 。

そのようです:

ここに画像の説明を入力してください

注:私のアプリケーションは、フォアグラウンドにないときに更新されたままである必要はありません。それは再び打ち上げられるまで幸せに眠ることができます。その時点で、最新のデータで自分自身を更新する必要があります。カイルは、 applicationWillEnterForegroundを使用して、問題のこの特定の側面に対する回答を提供しました。

Webサービスサーバーに負担をかけずにこれを実現するために、WebサービスのポーリングとPUSH通知を組み合わせて、1人のユーザー(iPad)がデータに変更を加えたときにポーリングをトリガーするソリューションを想像しました。したがって、フローは次のようになります。

  1. Webサービスの「デフォルト」ポーリングは、ユーザーが実行する可能性のあるアクションに関係なく、毎分起動します。

  2. ユーザーがインベントリアイテムをテーブルビューからドラッグしてストレージビンにドロップすると、同じ包括的なアカウントにログインしている他のiPadへのPUSH通知が開始され、Webサービスのポーリングがトリガーされてデータが更新されます。

つまり、iPad "A"のユーザーが何かを変更すると、PUSH通知がiPad "B"、iPad "C"などに送信されます。PUSHがB、C、Dなどによって受信されると、ユーザーはポーリングします。サーバーでデータを更新します。

これに代わる方法は、アカウント上のすべてのiPadが15秒ごとにWebサービスのポーリングを実行するようにすることです。これは私には帯域幅を消費するように思われます(そして多くの場合、データに変更はありません)。

私の質問は「どうすれば...?」ではありません。その他の「どうすれば...?」StackOverflowはこれをやや「主観的」だと思うかもしれませんが、この特定のプラクティスを調査し(PUSH通知を使用してWebサービスポーリングをトリガーする)、関連する記事がまったくないことを考えると、これは非常に価値のある質問だと思います。

これをお読みいただきありがとうございます。どんな助けでもいただければ幸いです。サンプルコードおよび/または特定のフレームワーク/キット情報をいただければ幸いです。しかし、本当に今、私はこれが良い考えであるかどうかを知る必要があります。

4

2 に答える 2

10

iOS 7 用に更新

したがって、あなたの質問の要点は、「プッシュ通知を Web サービスをポーリングする合図として使用するのが適切か」ということのようです。答えは「はい」です。iOS 7 より前では、これが機能するにはアプリがフォアグラウンドにある必要がありました。これで、 Background App Refreshを使用して、プッシュ メッセージを受信した後にバックグラウンドで Web サービスのポーリングをトリガーできるようになりました。

Apple 自身は、プッシュ通知を使用して Web サービス呼び出しをトリガーします。これは、Passbook のパスがリモートで更新される方法です。更新されたパスが利用可能になると、プッシュ通知が送信されます。これにより、iOS はパスでリンクされている適切な Web サービスを呼び出して、新しいペイロードをダウンロードします。

覚えておくべきいくつかのこと: 1 つ目は、プッシュ通知は保証されていない (必ずしも問題ではない) ことですが、いつ配信されるかについても保証されていません。ほとんどの場合、それが瞬時であることを望みますが、常にそうであるとは限りません。さらに、プッシュ通知をオプトアウトしているユーザーは、この機能を利用できません。

あなたがしようとしていることは、それほど新しい問題ではなく、プッシュ通知を使用して更新をトリガーする代わりに使用できる既存のソリューションがいくつかあります。ソケットベースのシステム (非常に複雑) または HTTP ロングポーリング (あまり複雑ではありません) を使用できます。これを非常に簡単に実現できるサードパーティのサービスもあります。そのようなサービスの 1 つがPusherです。

これら 3 つの選択肢すべて (ソケット、ロング ポーリング、サード パーティ サービス) の大きな利点の 1 つは、通常はプラットフォームに中立であり、(APNS とは異なり) 他のクライアントで簡単に使用できることです。私だったら、プッシュ通知よりもこれらのアプローチのいずれかを使用しますが、iOS 7 でアプリのバックグラウンド更新を使用すると、プッシュがやりたいことすべてをサポートできることに気付くかもしれません。

とにかく私の 2 セント - それがあなたに役立つことを願っています。

于 2012-12-26T21:43:01.853 に答える
2

最近、あるプロジェクトでこれについて話し合いました。私たちが結論付けた答えは、NOです。

理由:

  • プッシュ通知は保証されません。5 秒で到着する場合もあれば、15 分で到着する場合もあれば、まったく到着しない場合もあります。
  • ユーザーがアクティブなデータ接続を持っていることは保証されていないため、なんらかの確実なロジックと更新プロセスが必要になります。
  • 機密データ (個人に関連付けられる可能性のある ID) をプッシュ経由で送信する際のセキュリティの欠如。

また、ある種のソケット接続も調査しましたが、これには、対話中にアプリを開いたままにしておく必要があるという事実や、バッテリーの消耗の増加など、制限もあります.

最終的には、この機能はボタンのクリックによってトリガーされるもので十分であると判断しました。トレードオフはそれだけの価値がありませんでした。ただし、これは実行できないという意味ではなく、特定の状況では最善の方法である可能性があります。製品設計を詳しく調べて、この機能がどれほど重要かを判断することをお勧めします。些細な場合は、プッシュ通知を使用しないことをお勧めします。

アップデート:

別の可能なオプションは、ユーザーがアプリを再度開くたびに Web サービス呼び出しを開始することです。applicationWillEnterForeground を調べてみてください。おそらく、次のような解決策があります: applicationWillEnterForeground: reload Data from ViewController

于 2012-12-26T22:05:08.227 に答える