【问题标题】:How to get Reachability Notifications in iOS in Background when dropping Wi-Fi network?丢弃 Wi-Fi 网络时如何在后台获取 iOS 中的可达性通知?
【发布时间】:2012-04-06 07:46:31
【问题描述】:

我正在成功地使用 Reachability 来确定网络的状态,并收到更改通知(例如 Reachability Guide for iOS 4)。

我的问题不是如何启动和运行 Reachability,而是以下问题。

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

该应用旨在在发现失去 Wi-Fi 连接时重新加载正在播放的音频流,例如为了测试,我在“设置”中打开和关闭了 Wi-Fi,一切正常。在实际测试中,当我离开接入点的范围时,我经常会失去 Wi-Fi 连接。我发现在这种情况下,可达性对我没有太大帮助。我不确定这是否是因为当屏幕锁定时,可达性通知没有通过,或者如果可达性没有处理来自越来越远的 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;            
        }
    }    
}

即使应用在后台,通知也会发出,但在上述实际测试中却不会。

感谢您的帮助。

【问题讨论】:

  • 你试过reachabilityForInternetConnectionreachabilityForLocalWifi的组合吗?
  • 您找到解决方案了吗?我遇到了类似的问题,这里的解决方案似乎没有帮助或不是我想要的。
  • 我不知道我曾经解决过我的具体问题,因为我最近不需要处理那个项目。根据@Hurden 的建议,您是否确保应用程序正在后台运行并执行后台任务?
  • 是的,这确实是解决方案,尽管有细微的变化。如果有人遇到同样的问题,我会添加另一个答案。

标签: ios networking reachability


【解决方案1】:

默认情况下,应用程序在后台仅停留一小段时间,大多数应用程序很快就会进入暂停状态。这意味着应用程序在后台,但没有执行代码。因此,您的自定义实施通知不起作用。 必须在应用委托方法中的唤醒时间重新查询 NetworkReachability:

applicationWillEnterForeground:
applicationDidBecomeActive 

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多