与 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 开关以进行测试。(可达性在后台运行良好)
所以我可以追踪它并发现它显然在尝试在不再可用的接口的套接字上接收 httpu 数据报时崩溃,当关闭 wifi 时(recvLen = cg_socket_recv(sock, dgmPkt);
),如果我理解正确,这意味着后台线程正在侦听套接字在我的 UPNP 框架(CyberGarages 的 CyberLink)中不知道接口状态更改(可能是错误?),这就是为什么我真的想在接口状态更改后尽快停止 upnpService。
我正在使用 Tony Millions 的 Reachability 版本,收到后我会networkReachabilityChanged:
检查可用的接口,但我想这不是最好的方法。
谢谢。