2012-06-06 38 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類中。

相關問題