2011-10-02 72 views
5

我需要確定Internet連接是否可用。我不在乎它是如何連接的(WI-FI,Lan等)。我需要確定,Internet Connection是否可用。如何確定Cocoa中的Internet連接?

P.S.我找到了一種檢查WI-FI連接的方法。但我不在乎它是如何連接的(我需要檢查所有可以連接到Internet的方式)。

喜歡的東西(isConnected)

+1

http://stackoverflow.com/questions/2995822/check-internet-connection-in-cocoa-application – bryanmac

+0

的杜佩它也不是真的複製。該鏈接更多關於Iphone Internet連接。僅適用於Wi-Fi。 – User1234

+0

@ User1234:是什麼讓您相信提問者詢問iPhone或Wi-Fi? –

回答

8

看看在SCNetworkReachability參考。這是一個C API,因此它不像調用單個方法那麼容易,但是當通過網絡可達或不可達時,通知您的應用程序的功能非常出色。

梗概是你創建一個對象與SCNetworkReachabilityCreateWithAddressSCNetworkReachabilityCreateWithName,然後將其與SCNetworkReachabilityScheduleWithRunLoop添加到運行循環。當可達性被確定並且當它改變時,你提供的回調函數將被調用。您可以使用它來更新應用程序的狀態。

蘋果提供an example app演示瞭如何使用這個(雖然它的設計適用於iOS,不支持Mac OS X)

+0

非常感謝有趣的知道。但我需要它的MAC OS。我認爲應該有更簡單的使用方法。我想檢查一下我是否連接到了INternet -do Something。像(ifConnected){//在此處} – User1234

+2

這在Mac OS X上可用(鏈接文檔來自Mac OS X庫)。這個例子恰好是爲iOS編寫的。沒有系統提供的'isConnected'方法。但是你可以用它來編寫你自己的'isConnected'方法。 – Alex

+0

好的,謝謝你會嘗試。 – User1234

3

一種方式做到這一點是:

// Check whether the user has internet 
- (bool)hasInternet { 
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.google.com"]; 
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0]; 
    BOOL connectedToInternet = NO; 
    if ([NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]) { 
     connectedToInternet = YES; 
    } 
    //if (connectedToInternet) 
     //NSLog(@"We Have Internet!"); 
    [request release]; 
    [url release]; 
    return connectedToInternet; 
} 
+0

它正是我想要的。謝謝。 – User1234

+0

沒問題!感謝upvote! – Fatso

+6

這是一個糟糕的解決方案。您的應用程序將凍結,直到請求成功或失敗。這可能會導致您的應用程序停止長達60秒,如果他們有路由問題導致請求不失敗,直到超時。您的用戶不會理解這一點。即使成功,應用程序可能會停頓幾秒鐘,尤其是緩慢的連接。 – Alex

7

該代碼同時適用於iOS和OSX平臺,我希望。

#include <SystemConfiguration/SystemConfiguration.h> 
static BOOL isInternetConnection() 
{ 
    BOOL returnValue = NO; 

#ifdef TARGET_OS_MAC 

    struct sockaddr zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sa_len = sizeof(zeroAddress); 
    zeroAddress.sa_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&zeroAddress); 


#elif TARGET_OS_IPHONE 

    struct sockaddr_in address; 
    size_t address_len = sizeof(address); 
    memset(&address, 0, address_len); 
    address.sin_len = address_len; 
    address.sin_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&address); 

#endif 

    if (reachabilityRef != NULL) 
    { 
     SCNetworkReachabilityFlags flags = 0; 

     if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) 
     { 
      BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0); 
      BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0); 
      returnValue = (isReachable && !connectionRequired) ? YES : NO; 
     } 

     CFRelease(reachabilityRef); 
    } 

    return returnValue; 

} 
+0

這應該是答案!謝謝! – rocky

+0

其他人測試過嗎? – bgplaya

+0

我測試了這個,它效果很好。 – Mike