网络接口更改通知

时间:2013-07-27 21:32:31

标签: ios objective-c networking reachability upnp

在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框架(Cyber​​Garages的讯连科技)中监听套接字的后台线程不知道接口状态的变化(可能是bug?),这就是为什么我真的想在接口状态改变后尽快停止upnpService。

我正在使用Tony Millions的Reachability版本,一旦我收到networkReachabilityChanged:,我会检查可用的接口,但我想这不是最好的方法。

感谢。

0 个答案:

没有答案