可达性更改通知适用于iOS5,但不适用于iOS4

时间:2012-06-06 19:49:52

标签: ios

我将可访问性代码合并到我的应用程序中并且已经成功运行了几个月,但到目前为止我只在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];

只能在dealloc中调用stopNotifier

问题是ReachabilityCallback在没有更改时会被回调,但我看不出为什么它应该在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?

3 个答案:

答案 0 :(得分:4)

编辑发布通知的可达性代码,将其发布到主线程上,看看是否会改变您所看到的行为。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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