在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的讯连科技)中监听套接字的后台线程不知道接口状态的变化(可能是bug?),这就是为什么我真的想在接口状态改变后尽快停止upnpService。
我正在使用Tony Millions的Reachability版本,一旦我收到networkReachabilityChanged:
,我会检查可用的接口,但我想这不是最好的方法。
感谢。