2009-08-15 4 views
8

검색했지만 비슷한 질문을 볼 수 없습니다.인터넷에 연결되어 있어도 도달 가능성이 실패하는 경우가 있습니다.

도달 가능성 예제에 따라 인터넷 연결을 확인하는 방법이 추가되었습니다. 대부분의 경우 작동하지만, iPhone에 설치하면 인터넷 연결 (3G/EDGE - WiFi가 정상적인 경우에만)을하더라도 상당히 자주 실패합니다.

기본적으로 아래 코드는 NO를 반환합니다.

다른 앱으로 전환하면 Mail 또는 Safari라고 말하고 연결 한 다음 앱으로 다시 전환하면 코드에 인터넷에 연결할 수 있다고 표시됩니다. 그것이 '찌르기'가 필요한 것 같아요.

누구나 전에 본적이 있습니까? 어떤 아이디어? 당신이 애플의 예제 코드에서 몇 가지 기본적인 접근 가능성 코드를 제거 것 같은

많은 감사 제임스

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

답변

7

보인다. 그대로두면 어떻게됩니까?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

사과, 나는 약간의 멍청하다. 예제 Reachability 클래스를 프로젝트에 추가했지만 컴파일 할 수 없습니다. \t 도달 범위 * hostReach = [[reachability reachabilityWithHostName : @ "www.apple.com"] 유지]; 작동하지 않습니다. reachabilityWithHostName 메서드를 찾을 수 없습니다. 나는이 작품 ... – stoutyhk

+0

을 미세 조정하겠습니다 : + (BOOL) doWeHaveInternetConnection2 { \t \t을 경우 ([[도달 가능성 sharedReachability] internetConnectionStatus] == NotReachable) { \t \t 반환 NO; \t} \t else \t { \t \t return YES; \t} \t } – stoutyhk

+1

코드는 연결된 상태에서 항상 "NotConnected"를 제공합니다. 일단 "reachabilityChanged"메소드가 실행되면 올바른 상태가됩니다.그래서 첫 번째 위치에서 올바른 상태를 얻는 방법? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

버전 2를

+0

'+ sharedReachability '를 호출하면 2.0 이전 버전의 Reachability를 사용하고 있다는 것을 알 수 있습니다. 최신 버전은 일주일 전으로 게시되었으며 싱글 톤을 사용한 버전보다 훨씬 잘 작동합니다. 아래의 Matt의 대답은 최신 버전을 기반으로하므로 컴파일하는 데 문제가있었습니다. 최신 버전을 잡고 필요에 더 잘 맞는지 확인하십시오. – Tim

+0

고마워 - 새 버전이 있다는 것을 몰랐습니다. 많은 감사합니다. – stoutyhk

1

을 (죄송합니다, 코드 형식은 코멘트에서 작동하지 않았다), 코드는 다음과 같아야합니다

+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// reachabilityForInternetConnection- 기본 경로를 사용할 수 있는지 확인합니다. // 특정 호스트에 연결하지 않는 응용 프로그램에서 사용해야 함 – stoutyhk

+0

지난 밤에 iphone 장치에서 비행기 모드로 테스트 한 결과이 코드는 YES를 반환했지만 URL을 검색하면 실패했습니다. 그래서 나는 이것을 사용하지 않을 것이다. 특정 호스트에 대한 연결 확인으로 돌아갑니다. – stoutyhk

+0

reachabilityWithHostName을 사용하여 특정 호스트에 대한 연결을 테스트하면 휴대 전화에 IP 주소가 할당 될 때마다 틀린 긍정을 반환합니다. 시도해보십시오. 휴대 전화가 연결된 상태에서 무선 라우터의 케이블을 분리하고 [도달 가능성 도달 가능성 :]의 결과를 확인합니다. 분명히 호스트에 연결할 수는 없지만 매번 예일 것입니다. – Oscar

1

내가 발견 한 무엇 처음에 startNotifier이라고 부르는 스레드 (runloop)를 알아야한다는 것입니다. 백그라운드 스레드 또는 NSOperation에서 호출하면 해당 스레드의 실행 루프에서 알리는 루프가 시작됩니다. 과 같이 인스턴스를 공유 한 인스턴스는 마지막 호출자가 이기고 현재 실행중인 루프로 설정된 알림을 가져 오는 현재 코드 (2.0)에서 나타납니다.

관련 문제