2

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

问题是当可达性发生变化时,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 结合起来?

4

3 回答 3

4

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

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

(假设你在主线程上听他们)

于 2012-06-13T09:27:56.253 回答
0

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

于 2012-06-09T17:19:00.053 回答
0

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

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

于 2012-06-12T17:10:01.550 回答