丢弃Wi-Finetworking时如何在iOS中获取可达性通知?

我正在成功使用Reachability来确定networking的状态,并被通知更改(例如iOS 4的可访问性指南 )。

我的问题不是如何获得可达性和运行,而是以下。

我的AppDelegate处理可达性的东西。 应用程序在运行时收到通知( kReachabilityChangedNotification ),并在应用程序处于后台( applicationDidEnterBackground: kReachabilityChangedNotification时收到通知。

该应用程序旨在重新加载播放audiostream,当它注意到它失去了Wi-Fi连接,例如,为了testing,我打开和closures设置的Wi-Fi,一切工作完美。 在实际testing中,当我退出接入点范围时,经常会丢失Wi-Fi连接。 我发现在这种情况下,可达性并没有太多的帮助。 我不确定这是因为Reachability通知在屏幕locking时没有通过,或者如果Reachability不能处理来自距离越来越远的Wi-Fi接入点的信号缓慢递减,但是不pipe我无法确定为什么现实世界的testing不符合理想化的情况。

这是我的代码看起来像。 我首先设置接收通知,并开始收听可达性:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // check for internet connection [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; // Set up Reachability internetReachable = [[Reachability reachabilityForInternetConnection] retain]; [internetReachable startNotifier]; .... return YES; } 

然后,这是响应连接性变化的function:

 - (void)checkNetworkStatus:(NSNotification *)notice { // called after network status changes NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; switch (internetStatus) { case NotReachable: { NSLog(@"The internet is down."); break; } case ReachableViaWiFi: { NSLog(@"The internet is working via WIFI"); break; } case ReachableViaWWAN: { NSLog(@"The internet is working via WWAN!"); break; } } } 

即使应用程序处于后台,通知也会通过,但是它们不在上述的实际testing中。

谢谢你的帮助。

默认情况下,在后台状态应用程序只停留很短的时间,大多数应用程序不久后移动到挂起状态。 这意味着应用程序在后台,但不执行代码。 所以您的自定义实施通知不起作用。 在应用程序委托方法中,唤醒时必须重新查询NetworkReachability:

 applicationWillEnterForeground: applicationDidBecomeActive 

我正在开发一个VoIP应用程序,在iPhone启动时在后台启动,此时可能没有networking可达性(例如,如果电话同时具有密码和/或带有PIN码的SIM卡)。 但是由于应用程序直接在后台启动,所以不调用委托方法applicationDidEnterBackground: :。 相反,我所做的是直接在application:didFinishLaunchingWithOptions中使用@Hurden的想法,检查applicationState以查看应用程序是否真的在后台启动。 这使我的应用程序可以在手机解锁后启用kReachabilityChangedNotification通知(使WiFi能够使用存储的密码进行连接)。