我正在成功使用Reachability来确定网络状态,并收到有关更改的通知(例如Reachability Guide for iOS 4)。
我的问题不是如何让Reachability正常运行,而是如下。
我的AppDelegate
处理可达性内容。应用程序运行时以及应用程序位于后台(kReachabilityChangedNotification
)时,应用会收到通知(applicationDidEnterBackground:
)。
该应用程序旨在重新加载正在播放的音频流,当它注意到它丢失了Wi-Fi连接时,例如为了测试,我在“设置”中打开和关闭了Wi-Fi,一切都运行良好。在实际测试中,当我退出接入点的范围时,我经常会失去Wi-Fi连接。我发现在这种情况下,Reachability并没有帮助我太多。我不确定是不是因为当屏幕被锁定时,可达性通知没有通过,或者可达性无法处理来自越来越远的Wi-Fi接入点的信号缓慢减少,但无论我无法想象为什么现实世界的测试与理想化的案例不符。
这就是我的代码。我首先设置接收通知,然后开始收听Reachability:
- (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;
}
然后,这是响应连接变化的函数:
- (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;
}
}
}
即使应用程序处于后台,通知也会通过,但它们不在上述实际测试中。
感谢您的帮助。
答案 0 :(得分:5)
默认情况下,在后台状态应用程序仅停留一小段时间,大多数应用程序很快就会进入暂停状态。这意味着应用程序在后台但不执行代码。因此,您的自定义实施通知不起作用。 必须在应用程序委托方法中的唤醒时间重新查询NetworkReachability:
applicationWillEnterForeground:
applicationDidBecomeActive
答案 1 :(得分:1)
我正在开发一个VoIP应用程序,它在iPhone启动时在后台启动,此时可能没有网络可达性(例如,如果手机同时有密码和/或带有PIN的SIM卡码)。但由于应用程序直接在后台启动,因此不会调用委托方法applicationDidEnterBackground:
。相反,我所做的是直接在application:didFinishLaunchingWithOptions
中使用@Hurden的想法,检查applicationState
以查看应用程序是否实际在后台启动。这使我的应用程序在手机解锁后获得kReachabilityChangedNotification
通知(使用存储的密码启用WiFi连接)。