可及网络变更事件不开火
-
12-10-2019 - |
题
我的iPhone应用程序非常简单,可以使用一个可以处理所有内容的视图,在ViewDidload中,我检查是否有Internet连接,如果我们从网络上加载,如果不是,则我们从本地资源加载。而且这很好。
//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的范围内,我启动了该应用程序,一切正常。然后我走到WiFi的范围外,但是我的HandleNetworkChange从未开火(使用UialerTview进行了测试)。站在WiFi范围外,我的应用程序可以很好地启动脱机消息。
我的怀疑是,这是ViewController的生命周期的问题,是否应该将此代码放置在AppDelegate函数中?可能这是一个更好的设计。
解决方案
事实证明,这是一个内存管理问题,因为我没有保留可及性变量,因此,一旦将其出现在范围之外,DealLoc就会被调用,并且称为stopnotifier方法。因此,没有更新,因为我会走出范围。
因此,而不是:
reachability = [Reachability reachabilityForInternetConnection];
我愿意
reachability = [[Reachability reachabilityForInternetConnection] retain];
一切都起作用!
我从所有这些中学到的一件很酷的事情是,您可以通过仅关闭机场来模拟模拟器中的丢失连接。不再需要在外面徘徊。 :)
其他提示
看看Apple的可及性示例。我相信他们在AppDelegate中启动了通知。在我的一个应用程序中,我创建了一个布尔值变量,该变量不断地由AppDelegate连接更新方法更新,因此在我的其他视图控制器中,我只需要拨打委托并检查ISCONENCONET BOOL的值即可。
只是通过此处的另一种想法...我注意到可达性类别的问题,在检查可及性时,它可以冻结您的应用程序。在我的新应用程序中,我完全跳过了可及性类别,而是在didfail委托方法上进行nsurlconnection和uiwebview的传递,以确定我是否具有真正的连接性。我不再需要等待可及性课来弄清楚它,而无法决定该怎么做,我只需进行Web呼叫,然后将本地用作倒退。
希望这可以帮助!!
您应该在项目中包括SystemConfiguration.framework。
您的应用程序不在后台运行。
请在您的代表课中添加此方法
- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];
UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
dispatch_async(dispatch_get_main_queue(), ^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}];
}
谢谢