9

到達可能性ステータスが変化したときにのみメッセージを表示する到達可能性の例をたくさん見ます。
しかし最近、Foursquare アプリで、ユーザーがインターネット接続を必要とするアクションを実行しようとするたびにメッセージが表示されるのを見ました。
これは、インターネットなしでは何もできないことをユーザーに思い出させるための、より堅牢で優れた UX だと思います。主な理由は、ユーザーがアプリを切り替えたり、別のことをしたり、戻ってきたときに接続がないことを忘れたりできるからです。
また、接続が回復するとすぐに、インターネットからデータを取得して UI を更新していることがわかります。

私が本当に探しているのは、これを行うための最良の方法です。これはどのように行われますか?
接続が必要になるたびに到達可能性をチェックする一般的な UIViewController がありますか?
それとも、各インターネット リクエストの前に、リクエストをキャンセルしてメッセージを表示する一種のプロキシ クラスがありますか? 皆さんはどのように対処していますか?

ありがとう。

編集:

私が思いついた解決策は、ボックス内の到達可能性ステータスも提供する AFNetworking を使用することです。
基本的に、私は AFHTTPClient を作成し、それに到達可能性コールバック ブロックを設定して、ステータスの変化をリッスンしました。AFHTTPClient オブジェクトはアプリケーション全体です (一種のシングルトン)。(実際には、a.com、b.com に到達する必要があるホストごとに 1 つの AFHTTPClient があります ...)。

次に、リクエストを実行する必要がある場合は、新しい AFHTTPRequestOperation (私の場合は AFJSONRequestOperation) を作成し、それを AFHTTPClient オブジェクトのキューに入れます。networkReachabilityStatus操作の失敗ブロックで、AFHTTPClientのプロパティを使用してホストに到達できるかどうかを確認します。到達できない場合は、ユーザーへのインターネット接続がないというメッセージを表示します。

操作を作成するたびにこれを行う必要がないようにまとめました。そのため、アプリでは、接続がないときにユーザーが何かをしようとするたびに、インターネットにアクセスできないことを思い出させるメッセージが表示されます。
また、接続が回復したら (または、接続を確立する必要がある場合)、到達可能性コールバックを使用して画面にデータをリロードします。
これがベスト プラクティスかどうかはわかりませんが、新しい接続が利用可能になるとすぐに、アプリが重要なデータを再読み込みしてくれることを知っておくとよいと思います。

誰かがサンプル コードに興味を持っている場合は、それを提供できます。

4

1 に答える 1

18

今年の WWDC の講演で、ステージ上の Apple エンジニアは、アプリケーションのインターネット アクセスを Reachability サンプル アプリのステータスに基づいてはならないことをユーザーに推奨しました。多くの場合、到達可能性は完全な情報を提供しません (複雑なメカニズムに基づいています)。エンジニアから提供された提案は次のとおりです。

  1. 到達可能性ステータスに関係なく、インターネット接続を試みます。次に、成功/失敗の結果に基づいて UI ヒントを設定します
  2. ネットワークの問題が原因で失敗した場合は、Reachability に登録し、Reachability で青信号が出たら再試行します。これは、障害状態から自動的に回復する場合に必要です
  3. いずれにせよ、到達可能性ステータスが何であれ、ユーザーに「再試行を強制する」可能性を与えます。成功した場合は、すぐに UI ヒントをリセットしてください。

Apple のエンジニアが言ったことは完全に真実です。インターネット接続が完全に機能しているにもかかわらず、コンソール ログに到達可能性エラー メッセージが表示されることがよくあります。

その他: ステータス バーに表示されるものよりも優れた "ネットワーク ヒント" はありません: そこに Wi-Fi アイコン、3G/4G アイコン、携帯電話の電界強度がある場合。

元の質問に戻ります。これを管理するための絶対的に優れた方法はありません。これは、アプリケーション アーキテクチャに大きく依存します。専用のクラス (UIViewController ではなく NSObject サブクラス) にネットワーク関連のものを集中させたい場合は、最新のインターネット接続後に「成功/失敗」で更新されるそのクラスの読み取り専用プロパティを定義することが理にかなっています。サーバーアプリで(GoogleやAppleなどの他のサーバーにpingしても意味がありません。まず第一に、それはエレガントではありません.2番目の問題は、デバイスのインターネット接続ステータスではなく、アプリを提供するサーバーにある可能性があります!).

@property (readonly) BOOL lastConnectionToMyServerSuccess
次に、View Controller を (KVO または中央通知によって) このプロパティの変更に登録し、それに応じてアイコンを表示するなどして UI を更新します (繰り返しますが、ユーザーが手動でインターネットへの接続を試行できるようにします)。View Controller は、見えなくなったとき ("viewWillDisappear:")、アンロードされたとき ("viewDidLoad:")、または dealloc されたときに、KVO から登録解除する必要があります。

もちろん、これによりさらに複雑さが増します。例: アプリを使用すると、インターネット ライトが緑色になりました。次に、それを一時停止し、何か他のことをして、数分後にアプリに戻ります. このような場合、アプリはサーバーに ping を実行してインターネット ライトのステータスを再度復元する必要があります。数分後にネットワークの状態が変化している可能性があります (電車に乗っているなど)。いずれの場合でも、読み込まれたすべてのビュー コントローラーは、ネットワーク専用クラスから KVO 通知を取得し、自身を更新します。

于 2012-09-19T08:17:55.790 に答える