可达性更改通知在iOS5上有效,但在iOS4上无效

可达性更改通知在iOS5上有效,但在iOS4上无效,ios,Ios,我将可达性代码整合到我的应用程序中,它已经成功运行了几个月,但到目前为止,我只在iOS 5设备上使用过它。 但是,它不能在iOS 4设备上工作 该通知登记如下: - (id) init { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChange:)

我将可达性代码整合到我的应用程序中,它已经成功运行了几个月,但到目前为止,我只在iOS 5设备上使用过它。 但是,它不能在iOS 4设备上工作

该通知登记如下:

 - (id) init
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reachabilityChange:)
                                                 name:kReachabilityChangedNotification
                                               object:nil];

...


- (void) appBecameActive
{
...
self.reachability = [Reachability reachabilityWithHostName:[url host]];
...
[self.reachability startNotifier];
stopNotifier仅在dealloc中被调用

问题是当可达性发生变化时,可达性回调不会被回调,但我看不出有任何理由说明为什么它在iOS5上可以,而在iOS4上不能

这部分代码与Apple示例源代码相同:

static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) {
#pragma unused (target, flags)
  NSCAssert(info != NULL, @"info was NULL in ReachabilityCallback");
  NSCAssert([(__bridge id)info isKindOfClass:[Reachability class]], @"info was wrong class in ReachabilityCallback");

  Reachability *noteObject = (__bridge Reachability *)info;
  // Post a notification to notify the client that the network reachability changed.
  [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject];
}

如前所述,在iOS5设备上运行时,一切都正常运行了很长一段时间,过去是否有人遇到过类似的问题,将可达性代码合并到iOS4中?

kReachabilityChangedNotification
不是由系统框架生成的通知。它由可达性示例代码生成。示例代码旨在演示概念,而不是简单地复制并粘贴到应用程序中。我建议您开始查看问题源的可达性代码,而不是查看侦听通知的位置。

kReachabilityChangedNotification
不是由系统框架生成的通知。它由可达性示例代码生成。示例代码旨在演示概念,而不是简单地复制并粘贴到应用程序中。我建议您开始查看问题源的可达性代码,而不是查看侦听通知的位置。

在init方法中设置断点,以确保正在调用您的注册。如果不是,请将其移动到viewDidLoad或确保在其他地方调用了init方法


我也会为appBecameActive做同样的事情。为此设置一个断点,并检查以确保它正在启动。应该从此处调用它:ApplicationIDBecMeactive:在UIApplicationLegate类中。

在init方法中设置断点以确保正在调用注册。如果不是,请将其移动到viewDidLoad或确保在其他地方调用了init方法


我也会为appBecameActive做同样的事情。为此设置一个断点,并检查以确保它正在启动。应该从这里调用它:ApplicationIDBecomeActive:在UIApplicationLegate类中。

在可访问性中编辑将通知发布到主线程的代码,并查看这是否会更改您看到的行为

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject];
});

(假设您正在主线程上侦听它们)

编辑在可达性中发布通知以在主线程上发布通知的代码,并查看这是否会更改您看到的行为

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification object:noteObject];
});

(假设您正在主线程上收听它们)

每次我使用可达性时,我都会链接SystemConfiguration框架,您在这样做吗?谢谢,但是,正如我提到的,它在iO5上工作,如果没有框架,它将无法工作。。。。每次我使用可达性时,我都会链接SystemConfiguration框架,你在这样做吗?谢谢,但是,正如我提到的,它在iO5上工作,没有框架它就无法工作。。。。假设代码是被盲目复制和粘贴的,这是相当冒昧的。假设代码是被盲目复制和粘贴的,这是相当冒昧的。谢谢,我会尝试一下,但几天内我都没时间去做。如果它揭示了一些有趣的事情,我会发布悬赏。有人能澄清为什么这是必要的吗?在我做出建议的修改之前,我没有在iOS 6中收到可达性通知。它是原始可达性代码中的错误吗?通知是每个线程的。如果可达性对象位于某个线程上,而不是您正在收听的线程上,您就听不到它绝望地哀求关注。但通过进行此更改,您将所有通知发送到一个一致的线程(主线程,通过主队列),这也为您提供了一个可供侦听的一致线程。谢谢,我将尝试一下,但几天内无法进行此操作。如果它揭示了一些有趣的事情,我会发布悬赏。有人能澄清为什么这是必要的吗?在我做出建议的修改之前,我没有在iOS 6中收到可达性通知。它是原始可达性代码中的错误吗?通知是每个线程的。如果可达性对象位于某个线程上,而不是您正在收听的线程上,您就听不到它绝望地哀求关注。但通过进行此更改,您将使所有通知在一致线程(主线程,通过主队列)上发送,这也为您提供了一个一致的线程来监听。