2016-07-19 15 views
0

今、私は自分のアプリのネットワーキングシステムを構築しようとしています。私は自分のネットワーキングオペレーションがネットワーク障害後に自分自身を再試行できるようにしたい。利用者の強い要請で行われた要求の場合その後、ネットワークタスクを再起動する必要がありますか?

は常に接続を試みることは、Appleがこのような行為(Designing for Real-World Networks)について言っているものです。ネットワークサービスが利用可能かどうかを推測しないで、その決定をキャッシュしないでください。 接続に失敗した場合は、SCNetworkReachability APIを使用して、障害の原因を診断してください。次に、

  • 一時的なエラーのために接続が失敗した場合は、接続を再試行してください。
  • ホストに到達できないために接続に失敗した場合は、SCNetworkReachability APIが登録されたコールバックを呼び出すのを待ちます。ホストが再びアクセス可能になると、ブラウザのウィンドウを閉じるかキャンセルボタンをクリックするなど、ユーザーがリクエストを取り消すための何らかのアクションを行っていない限り、ユーザーの介入なしに接続の試行を自動的に再試行する必要があります。

私は正常にこの機能を実装しますが、私は«一時的なエラーの»が実際に何であるかを決定する問題を抱えています。

は、今私は500 ... 599の範囲でNSURLErrorNotConnectedToInternetNSURLErrorNetworkConnectionLostNSURLErrorInternationalRoamingOffNSURLErrorCallIsActiveNSURLErrorDataNotAllowedまたはNSURLErrorTimedOutを受信し、HTTPステータスコードの後に​​タスクを再試行するんだけど、私はそれらが十分にあるかはわかりません。

また、再試行動作を使用する経験豊富な開発者からアドバイスをいただき、誠にありがとうございます。タスクを再試行するタイミングと実行しないタイミングをどのように決定しますか?

ありがとうございます!

答えて

0

NSURLErrorCallIsActiveは、最近のデバイス(通話中にデータにアクセスできないデバイス用)では発生しません。それが起こると、ユーザーが電話を切るまで5秒ごとに再試行することができます。

NSURLErrorNotConnectedToInternet、NSURLErrorInternationalRoamingOff、NSURLErrorDataNotAllowedは、おそらくユーザアクションを必要とします。ユーザーに最初に伝えない限り、再試行は無意味です。

NSURLErrorNetworkConnectionLost、NSURLErrorTimedOut、および範囲500-599は再試行できますが、あまり頻繁ではありません。 「接続が失われました」は「接続されていません」に変更するか、再試行するときに有効になります。 「Timed Out」は通常、バックグラウンド操作であれば再試行したいので、通常は長時間(デフォルトは60秒)かかると考えてください。 500年代はあなたのコードに誤りがあるかもしれません。あるいは、サーバを再起動する必要があるかもしれないので、寛大な時間をかけて再試行してください。

+0

VerizonとSprintのAFAIKでは、現在のデバイスでも、通話中にデータにアクセスすることはできません(LTEを使用し、VoLTEがそのセルサイトで有効になっている場合を除く) )。 – dgatwood

3

NSURLErrorNetworkConnectionLost:一時的なエラー。直ちに、または少し遅れてからもう一度お試しください。

NSURLErrorNotConnectedToInternet:接続がないときに返されます。到達可能性が変わるのを待ってから、もう一度試してください。

NSURLErrorInternationalRoamingOff:データローミングを使用していないセルラー接続にいるときに返されます。到達可能性が変わるのを待ってから、もう一度試してください。

NSURLErrorCallIsActive:ユーザーが電話で話しているときに返されます。到達可能性が変わるのを待ってから、もう一度試してください。

NSURLErrorDataNotAllowed:あなたのリクエストが携帯電話では起こらず、ユーザーがWi-Fiでないと明示的に言った場合にのみ返されます。到達可能性が変わるのを待ってから、もう一度試してください。

NSURLErrorTimedOut:サーバーからの最初の応答を待っている接続の試行がタイムアウトすると、返されます。おそらく一時的なネットワークエラーです。ただちに再試行してください。試行回数を少数に制限してから、ネットワークをダウン状態にして、到達可能性が変わるのを待ってから再試行してください。可能性として、到達可能性チェックを開始し、要求を並行して再試行してください。

サーバーエラーは一時的なものではありませんが、再試行時に変更される可能性は低いです。あなたがこれらを処理する方法はアプリに依存しますが、データを保存して一定時間後に再試行したり、サーバが壊れていることをユーザに伝えたり(ユーザが何かできることがある場合)、自動的にあなたのサーバチームのトラブルチケットなど

関連する問題