使用する特定のライブラリ (Communigate の XIMSS) にインターネット接続を必要とするアプリケーションがあります。サーバーからステータスの更新を受け取り、ライブラリのソースを変更できません。デバイスがインターネットから切断されたことを検出する方法はありますか? 接続がまだあるかどうかを確認するために x 秒ごとにサーバーに ping を実行する必要はありません。
4 に答える
Apple のReachabilityがこれを行います。接続が変更されると通知します。
iOSでは、そのように確認できます:-
-(BOOL)returnInternetConnectionStatus{
ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
NetworkStatus internetStatus = [reach currentReachabilityStatus];
if ((internetStatus != NotReachable)) {
return TRUE;
} else {
return FALSE;
}
}
詳細については、ここからダウンロードできます。到達可能性のサンプル コード
これがあなたを助けることを願っています!
Reachability へのすべてのポインターは良い出発点であり、Reachability は間違いなく必要ですが、メッセージング アプリの場合は一般的に十分ではないことに注意してください。到達可能性がパケットを送信することはありません。要求された場合に、デバイスがパケットを送信しようとすることさえできるかどうかを示すだけです。したがって、基本的には、IP アドレスがあり、ゲートウェイを知っていることがわかります。関心のあるサーバーに到達できるかどうかはわかりません。また、そのサーバーが到達できるかどうかもまったくわかりません (これはメッセージング アプリにとって非常に重要な問題です)。
ほとんどの場合、到達可能性が十分であれば、到達可能性は必要ありません。Apple は、パケットを送信する前に到達可能性をチェックしないことを (正当な理由から) 強くお勧めします。パケットを送信するだけで、エラーが発生した場合に対処できます。しかし、ランダムなタイミングでデータを受信する必要があるアプリには役に立ちません。
接続が不十分な場合 (特にセル カバレッジが不十分なため)、またはユーザーとサーバーの間にファイアウォールがある場合、サーバーからメッセージを受信していなくても、到達可能性から簡単に肯定的な結果を得ることができます。この状況を検出する唯一の方法は、パケットを送信し、パケットを受信することです (つまり、「ping」)。
到達可能性も、接続が変更されたときに通知するには不十分です。たとえば、IP アドレスを変更した場合 (街中を運転しているときはよくあることです)、到達可能性は常に通知するとは限りません (を使用すると可能性がありますSCNetworkReachabilityCreateWithAddressPair()
。この問題に取り組んでからしばらく経ちますが、到達可能性の例はどのような場合でも、コードはこのようには機能しません)。
したがって、到達可能性は最初の出発点としては適切ですが、サーバーが通信していないことを検出したい場合は、1 日の終わりにまだハートビートが必要です。覚えておくべき重要なことは、IP には「接続」などというものがないということです。パケットがあるだけです。それらを送信することも、受信することもできます。しかし、受け取っていない場合、「誰も送っていない」と「届いていない」を区別する方法はありません。TCP が与える「接続」の錯覚は、パケットが交換されている場合にのみ存在します。
(ところで、メッセージング アプリでネットワーク接続を処理することは、おそらく私がこれまでに取り組んだ中で最も難しい iOS コードです。テストは悪夢です。ネットワーク アクセスを遮断するために、以前は電話を冷蔵庫に入れていました。少なくとも今は、ネットワークコンディショナー…)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ReachablilityChange:) name:kReachabilityChangedNotification object:nil];
Reachability Change Notification の通知機能を追加します。これは、ネットワークの変更が発生したときに、reachabilityChange を呼び出します。ReachblilityChange 関数で検出します。
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
hostStatus でステータスを取得する
if(hostStatus == NotReachable)
{ここでコードを実行してください;}