【问题标题】:Reachability change notification works on iOS5 but not iOS4可达性更改通知适用于 iOS5 但不适用于 iOS4
【发布时间】:2012-06-13 17:27:56
【问题描述】:

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

【问题讨论】:

  • 每次我使用 Reachability 时,我都会链接 SystemConfiguration 框架,你这样做了吗?
  • 谢谢,但是,正如我提到的,它适用于 iO5,如果没有框架,它就无法做到。

标签: ios


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我会试一试,但要几天才能完成。如果它揭示了一些有趣的事情,我会发布赏金。
  • 有人可以澄清为什么这是必要的吗?在进行建议的修改之前,我在 iOS 6 中没有收到可达性通知。这是原始可达性代码中的错误吗?
  • 通知是每个线程的。如果 Reachability 对象存在于您正在收听的线程之外的某个线程上,您将听不到它绝望、恳求关注的呼声。但是通过进行此更改,您可以在一致的线程(主线程,通过主队列)上发送所有通知,这也为您提供了一个一致的线程来监听。
【解决方案2】:

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

【讨论】:

  • 假设代码被盲目复制和粘贴是相当冒昧的。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多