誰もが使用する標準Reachability
クラスは非常に欺瞞的です。推測のみによって、ホストに到達可能かどうかを判断しようとします。たとえば、現在 www.google.com にアクセスできるかどうかを知りたい場合[Reachability reachabilityWithHostname:@"www.google.com"];
、アプリを呼び出すと、サーバーがオンになっているか、接続されているか、応答しているかを確認するために実際にサーバーに「アクセス」することはありません。
到達可能性が実際に行うことは、大まかに次のようになります。
- 現在の DNS 構成を使用して IP アドレスを検索します。DNS を解決できない場合、ホストに到達できません。
- すべての既知のネットワーク接続の現在の状態を調べます。それらがすべてダウンしている場合、ホストは到達不能です。
- ネットワーク アダプタごとに、宛先 IP がローカル サブネット上にあるかどうかを確認します。到達可能である場合は、到達可能であると報告します。
- ネットワーク アダプタごとに、宛先 IP へのルーティング パスが存在するかどうかを確認します。通常、これはデフォルト ゲートウェイのみを調べます。宛先 IP へのパスがある場合は、到達可能として報告します。
- すべてが失敗した場合、ホストに到達できません。
発生している問題は、Wi-Fi を使用しているが、スターバックスでは一般的であるように、ユーザーがまだ利用規約に同意していない場合、目的地が到達可能であると報告されることです。
ネットワーク接続をテストする唯一の実際の方法は、何かをダウンロードすることです。たとえば、サーバー上で Ping/Pong 機能やハートビート ファイルがこの目的のみに使用されているのをよく見かけます。この邸宅では、インターネットだけでなく、サーバーが期待どおりに機能しているかどうかをテストできます。