Reachability とは異なり、iOS でネットワーク インターフェイスが使用可能/使用不可になったときに通知を受け取る最良の方法は何ですか? (おそらく、SystemConfiguration や CFNetworks フレームワーク、または何らかの方法でネイティブの UNIX ソケット ネットワーキング API を使用して行う良い方法があるでしょうか?)
ネットワークの到達可能性をチェックする代わりに、この関数でネットワーク情報を取得できるかどうかをチェックしているだけです。唯一の問題は、いつチェックするかです。これを行うために 0.1 秒ごとに NSTimer を起動したくありませんが、これは解決策ですが、ユーザーが設定で WiFi のオン/オフを切り替えたときに通知を受け取りたいと考えています。(設定で wwan インターフェイスを無効にすると、到達可能性が通知されるまでに数秒かかります。)
- (void)initializeCurrentNetworkInfo
{
NSArray* interfacesSupported = (__bridge_transfer NSArray*) CNCopySupportedInterfaces();
NSLog(@"%s: Supported interfaces: %@", __func__, interfacesSupported);
NSDictionary* interfaceInfo = nil;
for (NSString *interfaceName in interfacesSupported) {
interfaceInfo = (__bridge_transfer NSDictionary*) CNCopyCurrentNetworkInfo((__bridge_retained CFStringRef)interfaceName);
if (interfaceInfo && [interfaceInfo count]) {
self.isInterfaceActive = YES;
self.currentSSID = [NSString stringWithString:interfaceInfo[@"SSID"]];
self.currentBSSID = [NSString stringWithString:interfaceInfo[@"BSSID"]];
break;
} else if (!interfaceInfo){
self.isInterfaceActive = NO;
self.currentBSSID = @"ff:ff:ff:ff:ff:ff";;
self.currentSSID = @"interface is unavailable";
}
}
}
情報: UPNP アプリケーションを開発していますが、インターフェイスが使用可能/使用不可になるたびに、UPNP サービス オブジェクトを初期化または無効化します。問題は、テスト目的で Wi-Fi スイッチのオン/オフを変更しているときに、まれにアプリがクラッシュすることです。(到達可能性はバックグラウンドで正常に機能します)
recvLen = cg_socket_recv(sock, dgmPkt);
だから私はそれを追跡して、wifiをオフに切り替えると( )、使用できなくなったインターフェースのソケットでhttpuデータグラムを受信しようとしているときに明らかにクラッシュすることがわかりました。私の UPNP フレームワーク (CyberGarages の CyberLink) では、インターフェイスの状態の変化 (おそらくバグ?) を認識していないため、インターフェイスの状態が変化したらできるだけ早く upnpService を停止したいと考えています。
私は Tony Millions の Reachability バージョンを使用しており、受け取っnetworkReachabilityChanged:
たら使用可能なインターフェイスを確認しますが、これは最善の方法ではないと思います。
ありがとう。