2012-06-06 37 views
1

我将可达性代码整合到我的应用程序中,并且已成功运行了几个月,但目前为止,我只在iOS 5设备上使用它。 但是它不适用于iOS 4设备。可达性更改通知适用于iOS5,但不适用于iOS4

该通知登记如下:

- (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没有接到回访电话时,有一个reachabiity的变化,但我看不到任何理由为什么它应该可以在iOS5上使用,但不能在iOS4上使用。

的这部分代码是从苹果的示例源代码不变:

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中?

+2

每次我与可达性工作,我链接SystemConfiguration框架,你在干什么呢? – kevboh

+0

谢谢,但正如我所说,它可以在iO5上运行,如果没有框架,它将无法运行。 – Gruntcakes

+7

... [你刚刚对你的问题做了什么?](http://stackoverflow.com/posts/10921145/revisions) – BoltClock

回答

4

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

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

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

+0

谢谢,我会试试看,但几天之内就无法绕过它。如果它揭示了一些有趣的事情,我会发布赏金。 – Gruntcakes

+0

有人可以澄清为什么这是必要的吗?在我进行建议修改之前,我没有在iOS 6中收到Reachability通知。这是原始Reachability代码中的错误吗? – hpique

+0

通知是每个线程。如果Reachability对象存在于您正在监听的某个线程之外的某个线程中,您听不到它绝望,请求注意。但通过进行这种更改,您可以使所有通知以一致的线程(主线程,通过主队列)发送,这也为您提供一致的线程来侦听。 – quellish

0

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

+0

这是非常冒失的假设代码被盲目复制和粘贴。 – Gruntcakes

0

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

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

相关问题