2012-10-04 4 views
3

여기에 이상한 버그가 있습니다. 이는 iOS 기기가 3G/4G 네트워크에서만 독점적으로 사용되는 경우에만 나타납니다. WiFi를 통한 경우 - 버그가 없으며 모두 정상적으로 작동합니다.CFNetDiagnosticCopyNetworkStatusPassively에서 가능한 버그? 3G/4G에서만 kCFNetDiagnosticConnectionDown을 반환합니다.

- (BOOL) isInternetAccessAvailable 
{ 
    CFNetDiagnosticRef diag; 

    diag = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.apple.com"]); 

    CFNetDiagnosticStatus status; 

    status = CFNetDiagnosticCopyNetworkStatusPassively (diag, NULL); 

    CFRelease (diag); 

    if (status == kCFNetDiagnosticConnectionUp) 
    { 
     return YES; 
    } 
    else 
    { 
     NSString * title = @"No Internet Connection"; 
     NSString * message = @"Please ensure you have an Internet Connection."; 

     [self showAlertWithTitle:title andMessage:message]; 

     return NO; 
    } 
} 

좋아요, 좋아요. 그래서 위의 방법은 UIWebView에 데이터를로드하고로드하기 전에 호출됩니다.

내가 말했듯이 - WiFi 네트워크를 통해 완벽하게 작동합니다.

WiFi가 꺼져 있거나 (연결되어 있지 않거나 연결되어 있지 않음) 장치가 3G/4G 네트워크 용 SIM을 사용하는 경우.

라인은 어디에 전화입니다 :

status = CFNetDiagnosticCopyNetworkStatusPassively (diag, NULL); 

는 긴 상당을 반환

kCFNetDiagnosticConnectionDown 

그래서 그러므로 내 테스트가 실패하고 난 사용자에게 경고 UIAlertView를 표시합니다.

하지만 네트워크가 있습니다! 나는이에 테스트 라인을 변경하는 경우 :

if ((status == kCFNetDiagnosticConnectionUp) || (status == kCFNetDiagnosticConnectionDown)) 

그것은 3G/4G를 통해 작동하고 웹 페이지를 다운로드 - 그래서 장치 또는 네트워크 잘못이 아니다.

그러나 CFNetDiagnosticCopyNetworkStatusPassively에 대한 전화는 3G/4G에서만 실패합니다.

아이디어가 있으십니까?

최근 광고 및 머천다이징 기한을 지키기 위해 최근에 앱 스토어로 급히 돌아가는 앱에서이 코드가 발견되었으며 코드에 오류가있는 경우이를 수정하고 다시 제출해야합니다.

답변

4

Apple에서 확인 된 버그입니다. 당신이 원하는 경우

속는 : 버그 ID 번호는 12443370

+0

에 Reachability.h 및 Reachability.m을 가지고? – Anthone

+0

무엇을 의미합니까? – iOSProgrammingIsFun

+0

여기에 버그에 대한 링크 및/또는 "dupe" –

1

당신은 접속

How to check for an active Internet connection on iOS or OSX?를 확인하려면이 옵션을 사용할 수 있습니다.

동기 버전에 대한 답변 cannyboyn : 당신이 사과로 버그를 확인 찾을 수 있습니다 https://github.com/tonymillion/Reachability

#import "Reachability.h" 

- (BOOL)connected 
{ 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus networkStatus = [reachability currentReachabilityStatus]; 
    return !(networkStatus == NotReachable); 
} 
+0

그건 중요하지 않습니다. 도달 가능성은이 검사를 수행하는 한 가지 방법입니다. 요점은 위의 코드가 완벽하게 유효하며 모든 iOS 버전 APART FROM 6.0에서 작동한다는 것입니다. 이것은 Apple과 검증되었으며 요청한대로 버그로 기록됩니다. – iOSProgrammingIsFun