2013-04-11 8 views
0

그래서 여기에 Reachability 구현에 대한 많은 게시물이 있지만 그 중 특정 질문에 대한 답을 찾을 수 없습니다.도달 가능성 hostStatus가 false를 반환 함

다음 코드를 구현 중이지만 hostStatus가 항상 NotReachable로 되돌아옵니다.

내 .H 파일 :

#import <UIKit/UIKit.h> 
#import "Reachability.h" 

@class Reachability; 
@interface ViewController : UIViewController<UINavigationControllerDelegate>{ 

    Reachability* hostReachable; 
    Reachability* internetReachable; 

} 

@property (nonatomic, assign) BOOL wifiReachable; 
@property (nonatomic, assign) BOOL networkReachable; 
@property (nonatomic, assign) BOOL internetUsable; 

내하는 .m 파일 :

#import "ViewController.h" 
#import "Reachability.h" 
#import "Reachability.m" 

@interface ViewController() 
@end 

@implementation ViewController 
- (void)viewDidLoad{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 

internetReachable = [Reachability reachabilityForInternetConnection]; 
    hostReachable = [Reachability reachabilityWithHostName:@"www.google.com"]; 

    [internetReachable startNotifier]; 
    [hostReachable startNotifier]; 
    // now patiently wait for the notification 
    [self checkNetworkStatus:kReachabilityChangedNotification]; 

    if(self.internetUsable==TRUE){ 
    //DO STUFF 
    } 
    else{ 
    [self internetAlert]; 
    //DO OTHER STUFF 
    } 
} 


-(void) checkNetworkStatus:(NSNotification *)notice{ 


    // called after network status changes 
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 
    NSLog(@"%u", hostStatus); 
    if(internetStatus==NotReachable){ 
    NSLog(@"The internet is down."); 
    self.internetUsable=FALSE; 
    } 
    else{ 
    if(internetStatus==ReachableViaWWAN){ 
     NSLog(@"The internet is working via WWAN."); 
     self.networkReachable=TRUE; 
     self.internetUsable=TRUE; 
    } 
    else if (internetStatus==ReachableViaWiFi) { 
     NSLog(@"The internet is working via WIFI."); 
     self.wifiReachable=TRUE; 
     self.internetUsable=TRUE; 
    } 
    else{ 
     self.networkReachable=FALSE; 
     self.wifiReachable=FALSE; 
     self.internetUsable=FALSE; 
     NSLog(@"The internet is NOT useable."); 
    } 
    } 

    if(self.internetUsable==TRUE) 
    { 

    if(hostStatus==NotReachable) 
    { 
     self.internetUsable=FALSE; 
     NSLog(@"Could not connect to the host"); 
    } 
    } 

} 

내 생각 엔이 hostStatus 연결이 제대로 확인되기 전에는 CheckNetworkStatus 방법에 진입하고 있다는 점이다.

도움이 될만한 정보가 있습니까?

답변

0

정확합니다. 문제는 Reachability 호출이 동기 적이 지 않다는 것입니다. -checkNetworkStatus: 메서드는 callback이며 직접 호출하지 않습니다. 대신, 시스템이 네트워크 도달 가능성이 변경되었다는 것을 알 때마다 메소드 자체를 호출합니다. 그대로, 귀하의 코드는 Reachability 개체가 인스턴스화 된 직후 네트워크 상태를 확인하고 네트워크에서 응답을 받기 훨씬 오래 걸릴 수 있습니다. 에서 -checkNetworkStatus:을 제거하면 올바른 결과를 얻을 수 있습니다.

이 (당신은 kReachabilityChangedNotification 때문에 어쨌든 컴파일러 경고를 받고있을거야 것은 어쨌든 NSString 아닌 UINotification#define입니다 - 선택하고 마우스 오른쪽 단추로 클릭 '정의에 점프'와 수행이 볼 - 그것은 Reachability.h에 있어요).

- [[NSNotificationCenter defaultCenter]removeObserver:self name:kReachabilityChangedNotification object:nil];-dealloc으로 호출하십시오. 잊어 버리고 객체가 할당 해제되면 (이전에 나를 잡았습니다.) 성가신 충돌이 발생합니다.