我的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函数中吗?可能这是一个更好的设计开始。
答案 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;
});
}];
}
由于