5

我的 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范围内,我启动了应用程序,一切正常。然后我走出 wifi 的范围,但我的 handleNetworkChange 从未触发(使用 uiAlertView 测试)。站在 wifi 范围之外,我的应用程序可以很好地启动离线消息。

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

4

4 回答 4

18

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

所以而不是:

reachability = [Reachability reachabilityForInternetConnection];

我愿意

reachability = [[Reachability reachabilityForInternetConnection] retain];

一切正常!

我从这一切中学到的一件很酷的事情是,您可以通过简单地关闭 Airport Off 来模拟模拟器中丢失的连接。再也不用在外面闲逛了。:)

于 2010-12-21T19:30:27.183 回答
0

看看 Apple 的可达性示例。我相信他们在 AppDelegate 中开始他们的通知。在我的一个应用程序中,我创建了一个布尔变量,该变量由 AppDelegate 连接更新方法不断更新,因此在我的其他视图控制器中,我只需要调用委托并检查 IsConnected 布尔值的值。

只是在这里通过另一个想法......我注意到可达性类的问题,当您检查可达性时,它可以冻结您的应用程序。在我的新应用程序中,我完全跳过了可达性类,而是依靠 NSUrlConnection 和 UIWebView 的 DidFail 委托方法来确定我是否具有真正的连接性。我不再需要等待可达性类弄清楚它并失败让我决定要做什么,我只需继续进行网络调用并使用本地作为后备。

希望这可以帮助!!

于 2010-12-21T17:18:24.803 回答
-1

您应该将 systemconfiguration.framework 包含在您的项目中。

于 2014-04-12T18:13:21.993 回答
-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;
        });
    }];

}

谢谢

于 2013-11-25T12:02:27.473 回答