我的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;
        });
    }];

}

谢谢

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top