2010-12-21 115 views
5

我iPhone應用程序可訪問性網絡改變事件是與處理一切,在viewDidLoad中我檢查,看看是否有互聯網連接,如果我們這樣做,我們從網頁加載,如果沒有,我們從加載一個觀點很簡單本地資源。這工作正常。沒有發射

//in viewDidOnload  
[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(handleNetworkChange:) 
              name:kReachabilityChangedNotification object:nil]; 
reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 
NetworkStatus status = [reachability currentReachabilityStatus]; 

if (status == NotReachable) { 
    //Do something offline 
} else { 
    //Do sometihng on line 
} 

- (void)handleNetworkChange:(NSNotification *)notice{ 
NetworkStatus status = [reachability currentReachabilityStatus]; 
if (status == NotReachable) { 
    //Change to offline Message 
} else { 
    //Relaunch online application 
} 

} 

爲了測試我的handleNetworkChange事件,我關閉了所有蜂窩數據,但是沒有開啓wifi。在WiFi的範圍內,我開始了應用程序,一切都很完美。然後我走在無線網絡的範圍之外,但是我的handleNetworkChange從不會觸發(使用uiAlertView進行測試)。站在無線的範圍之外,我的應用程序啓動離線消息就好了。

我懷疑是它與視圖控制器的生命週期問題,應將此代碼放在AppDelegate的功能?可能這是一個更好的設計開始。

+0

我認爲應該在init init可達性實例後面聲明NSNotification行。 – Raptor 2012-02-09 02:48:08

回答

18

原來這是一個內存管理問題,因爲我沒有保留的可達性變量,所以只要它會走出去的範圍的dealloc將被調用,並且被稱爲stopNotifier方法。因此沒有更新,因爲我會走出範圍。

所以不是:

reachability = [Reachability reachabilityForInternetConnection]; 

我做

reachability = [[Reachability reachabilityForInternetConnection] retain]; 

和一切正常!

我經歷了所有這一切瞭解到一個很酷的事情是,你可以模擬一個轉機場關閉在模擬器連接丟失。沒有更多的必須在外面徘徊。 :)

+0

我需要在某個時候釋放它嗎?可能在我的viewcontroller的dealloc? – ashansky 2010-12-22 16:27:03

0

查看Apple的可訪問性示例。我相信他們在AppDelegate中開始他們的通知。在我的一個應用程序中,我創建了一個布爾變量,該變量由AppDelegate連接更新方法不斷更新,因此在其他視圖控制器中,我只需調用委託並檢查IsConnected布爾的值。與可達性類中,它可以凍結你的應用程序

只是通過在這裏的另一個想法...我已經注意到的問題時,你的可達性檢查。在我的新應用程序中,我完全跳過可達性類,而是爲NSUrlConnection和UIWebView傳遞DidFail委託方法,以確定我是否具有真正的連接。我不再需要等待可達性類來解決這個問題,然後我不能再決定做什麼,我只需進行Web調用並使用本地作爲回退。

希望這有助於!

+0

嗯我一定在做一些嚴重錯誤的事情。我試着將它移動到AppDelegate,但仍然沒有任何東西.... – ashansky 2010-12-21 19:07:31

-2

您的應用程序沒有在後臺運行。

請您委託類添加此方法

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ UIApplication* app = [UIApplication sharedApplication]; 

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{ 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [app endBackgroundTask:bgTask]; 
      bgTask = UIBackgroundTaskInvalid; 
     }); 
    }]; 

} 

感謝

-1

您應該包括systemconfiguration.framework到您的項目。