2010-01-28 2 views
3

내 앱이 시작되면 즉각적인 인터넷 연결이 필요하기 때문에 연결 가능성을 확인합니다. 내 문제는 비록 Reachability가 설정된 직후에 즉, NetworkStatus에 대한 즉각적인 확인이없는 것으로 보입니다. 즉, 연결 여부를 확인하고 실제로 연결되었는지 여부에 관계없이 연결이 있는지 여부를 반환합니다. WiFi/3G 또는 라디오를 껐습니다. 내가 잘못 뭐하는 거지도달 가능성 (2.0.3ddg)에 대한 도움이 필요합니다.

내가 바로 아래 applicationDidFinishLaunching 후, 다음 "ReachableViaWiFi"을 기록 알림이 때문에 나는 인터넷 연결을 받고 사실임을 확인할 수

..

? 바로 인터넷 연결을 확인하지 않는 이유는 무엇입니까?

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 
    if (netStatus == NotReachable) { 
     ErrorViewController *errorViewController = [[ErrorViewController alloc] initWithNibName:@"ErrorView" bundle:[NSBundle mainBundle]]; 
     [tabBarController.view removeFromSuperview]; 
     [window addSubview:[errorViewController view]]; 
     return; 
    } 
} 

-(void)setupReachability { 
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil]; 
    hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; 
    [hostReach startNotifier]; 
} 

-(void)reachabilityChanged:(NSNotification *)notification { 
    Reachability* curReach = [notification object]; 
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 
    NetworkStatus netStatus = [curReach currentReachabilityStatus]; 
    BOOL connectionRequired = [curReach connectionRequired]; 
    switch (netStatus) 
    { 
     case NotReachable: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS]; 
      NSLog(@"NotReachable"); 
      connectionRequired = NO; 
      break; 
     } 

     case ReachableViaWWAN: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kREACHABLEVIAWWAN forKey:kREACHABILITYSTATUS]; 
      NSLog(@"ReachableViaWWAN"); 
      break; 
     } 
     case ReachableViaWiFi: 
     { 
      [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS]; 
      NSLog(@"ReachableViaWiFi"); 
      break; 
     } 
    } 
} 

답변

4

확인, 자신을 몇 가지를 시도 후, 나는 실제로 가지고 그래서 하나의 코드 여분의 줄을 추가하여 작동합니다 :

-(void)setupReachability { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotificationV2 object:nil]; 
    hostReach = [[ReachabilityV2 reachabilityWithHostName:@"www.google.com"] retain]; 
    [hostReach connectionRequired]; // this line was added, and apparently forces a connection requirement.. 
    [hostReach startNotifier]; 
} 
2

도달 가능성 샘플 코드는 도달 가능성이 변경된 방법 /시기를 알려주기 위해 비동기 콜백/알림을 제공합니다. 다음과 같이 코드가 작동하기 위해서는, 당신은 당신의 코드를 수정해야합니다 : 콜백에서 다음

- (void) applicationDidFinishLaunching:(UIApplication *)application { 

// setup reachability 
    [self setupReachability]; 
} 

을, 당신은 응용 프로그램에서 필요에 따라 반응하는 통지를받을 때.

즉, applicationDidFinishLaunching()에서 즉시 네트워크 상태를 확인할 수 없습니다. 그렇게하고 싶다면 동기식/차단 방식을 사용해야합니다. 예를 들어 내 답변에 제공된 코드를 this 질문에 사용할 수 있습니다.

+0

나는 애플이 도달 가능성을 비행 전 점검이라고 말한 확인을 추가 할 수있다. 가능한 한 빨리 작동하도록하려면 연결 상태에 대한 알림을 실행 가능으로 설정해야하는 앱 실행 즉시 일부 확인 URL을 열어보십시오. –

+0

"isConnectionRequired"와 같은 것을 설정할 수 없으므로 네트워크 검사가 필요합니까? – runmad

1

당신은 클래스 레벨의 변수로 hostReach을해야한다.

+0

그건 내게 문제 였어. – pt2ph8