可达性网络更改事件未触发

时间:2010-12-21 17:02:01

标签: iphone objective-c reachability nsnotificationcenter

我的iphone应用非常简单,有一个处理所有内容的视图,在viewDidLoad中,我检查是否有互联网连接,如果我们从网络加载,如果不是,我们从本地资源加载。这很好。

//in viewDidOnload    
[[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(handleNetworkChange:) 
                                          name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];

if (status == NotReachable) {
    //Do something offline
} else {
    //Do sometihng on line
}

- (void)handleNetworkChange:(NSNotification *)notice{
 NetworkStatus status = [reachability currentReachabilityStatus];
 if (status == NotReachable) {
  //Change to offline Message
 } else {
  //Relaunch online application
 }

}

为了测试我的handleNetworkChange事件,我关掉了所有的蜂窝数据但是打开了wifi。在无线网络的范围内我启动了应用程序,一切都很完美。然后我走出wifi的范围之外,但我的handleNetworkChange从未触发(使用uiAlertView测试)。站在wifi的范围之外,我的应用程序启动离线消息就好了。

我怀疑这是ViewController生命周期的问题,这个代码应放在AppDelegate函数中吗?可能这是一个更好的设计开始。

4 个答案:

答案 0 :(得分:18)

原来这是一个内存管理问题,因为我没有保留可达性变量,因此只要它超出范围,就会调用dealloc并调用stopNotifier方法。因此我没有更新,因为我会走出范围。

所以而不是:

reachability = [Reachability reachabilityForInternetConnection];

我做

reachability = [[Reachability reachabilityForInternetConnection] retain];

一切正常!

我通过所有这些了解到的一件很酷的事情是,您可以通过简单地关闭机场来模拟模拟器中丢失的连接。不再需要在外面闲逛。 :)

答案 1 :(得分:0)

看一下Apple的可达性示例。我相信他们会在AppDelegate中发起通知。在我的一个应用程序中,我创建了一个布尔变量,它通过AppDelegate连接更新方法不断更新,所以在我的其他视图控制器中,我只需要调用委托并检查IsConnected bool的值。

通过这里的另一个想法......我注意到了可达性类的问题,在检查可达性时它可以冻结你的应用程序。在我的新应用程序中,我完全跳过了可访问性类,而是继续使用NSUrlConnection和UIWebView的DidFail委托方法来确定我是否具有真正的连接性。我不再需要等待可达性类来解决这个问题,然后我决定该怎么做,我只是继续进行网络通话并使用本地作为后退。

希望这会有所帮助!!

答案 2 :(得分:-1)

您应该在系统中包含systemconfiguration.framework。

答案 3 :(得分:-2)

您的应用程序未在后台运行。

请在您的委托类

中添加此方法
- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
    }];

}

由于