2014-07-01 3 views
3

웹 서비스를 다루는 iOS 애플리케이션을 만들고 있습니다. 웹에 연결되어 있는지 감지하려면 this code을 사용하고 있습니다. 인터넷에 연결되어 있지 않다면 iOS 앱 스토어와 유사한 인터넷 연결이 없다는 메시지를 표시합니다. 내 문제는이 코드를 삽입 할 방법이 확실하지 않다는 것입니다.iOS 앱에서 네트워크 연결을 확인하는 곳

사용자가 앱을 열고 다른 앱을 사용하여 앱으로 전환 할 때마다 (예 : 내 앱이 백그라운드에서 열리고 사용자가 스위치를 누르면) 네트워크 상태를 확인합니다. 나는 그것을 애플 리케이션 델리게이트에 넣는 것이 효과가있을 것이라고 생각했지만 그렇지 않았다. 나는 또한 각보기 컨트롤러 viewWillAppear 메서드에 넣고 그것에 대해 생각하고 그 작동하지 않았다.

이 코드를 어디에 둘 것인지 생각해보십시오.

답변

2

각 네트워크 요청 전에 활성 인터넷 연결을 확인하는 것이 이상적입니다.

하지만 게시 한 링크는 그 순간 네트워크 상태를 탐지하기위한 것입니다. 대신 네트워크 작업 상태가 변경 될 때마다 알려주는 알림을 관찰해야합니다.

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(networkStateChanged:) 
               name:kReachabilityChangedNotification object:nil]; 
Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

- (void)networkStateChanged:(NSNotification *)notice { 
    NetworkStatus currentNetStatus = [reachability currentReachabilityStatus]; 
    if (currentNetStatus == NotReachable) { 
     // No Internet connection 
    } else { 
     // We are back ! 
    } 
} 

이 옵서버는 앱 대리인에 있어야합니다.

5

당신이 네트워크 연결을 사용하려는 경우, 당신은 지금 NSURLSession 위에 구축 AFNetworking https://github.com/AFNetworking/AFNetworking

AFNetworking의 최신 버전 (2.0)을 살펴해야한다, 그래서 당신은 훌륭한 기능을 모두 제공받을 그곳에. 그러나 직렬화, 연결 가능성 지원, UIKit 통합 (UIImageView에서 이미지를 비동기 적으로로드하는 편리한 카테고리 등) 등과 같은 많은 유용한 기능을 추가로 얻을 수 있습니다. 또한 10,000 개 이상의 별, 2,600 개의 포크 및 Github의 160 명의 기고가가 참여하는 가장 널리 사용되는 오픈 소스 프로젝트 중 하나입니다.

귀하의 요청을 처리하기 위해 AFNetworkReachabilityManager이라는 기능이 있습니다. 당신은 모든 웹 서비스를 호출해야하는 경우

[[AFNetworkReachabilityManager sharedManager] startMonitoring]; 
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    DLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 
    switch (status) { 
     case AFNetworkReachabilityStatusReachableViaWWAN: 
     case AFNetworkReachabilityStatusReachableViaWiFi: 
      [operationQueue setSuspended:NO]; 
      NSLog(@"WIFI"); 
      break; 
     case AFNetworkReachabilityStatusNotReachable: 
     default: 
      [operationQueue setSuspended:YES]; 
      NSLog(@"oflline"); 
      break; 
    } 
}]; 

당신이 코드 내 경우에 수행 한 어떤 here

+1

' "어떤 이유에서든 네트워크 연결을 사용하려는 경우 AFNetworking"굵은 글씨체 비트를 살펴 봐야합니다. 왜 우리는 AFNetworking을 다른 써드 파티 라이브러리 나 애플의 NSURLConnection보다 더 사용해야합니까?대신 ASIHTTPRequest를 사용하지 않으시겠습니까? (제 생각에 정확히 왜, 제 요점은 진술서를 뒷받침 할 필요가 있다는 것입니다. 대답 하시려면 대답을 남겨주세요.) – Popeye

+0

감사합니다. @Popeye에게 의견을 보내 주십시오. 나는 이것이 더 나은 것이기를 바랍니다. – tgyhlsb

+0

훨씬 좋은 +1입니다. – Popeye

1

을 찾을 수 있습니다, 나는 didFinishLaunchingWithOptions 또한

// Instantiate Shared Manager 
[AFNetworkReachabilityManager sharedManager]; 

// Start network networking monitoring 
[[AFNetworkReachabilityManager sharedManager] startMonitoring]; 

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status)); 


    if ([[AFNetworkReachabilityManager sharedManager] isReachable]) { 
     NSLog(@"IS REACHABILE"); 

     //Here check if your network connection view is already showing on screen, if positive then remove it 
     if (_viewNetworkConnectionCheck) { 
      //[_viewNetworkConnectionCheck removeFromSuperView]; 
      _viewNetworkConnectionCheck = nil; 
     } 
    } else { 

     NSLog(@"NOT REACHABLE"); 

     //You have to add your network connectivity view here, just make sure if has been has not been allowcated 
     if (!_viewNetworkConnectionCheck) { 

      //[[UIApplication sharedApplication].keyWindow addSubview:_viewNetworkConnectionCheck]; 
     } 
    } 
}]; 

에 조각 아래에 넣어 가지고 있었다 시간 애플 리케이션 백그라운드 상태에서 전경 상태로 간다 다음 당신이 할 수있는 (또는 내가 한 일은) 위임 응용 프로그램에서 스 니펫 아래에 넣으십시오 .WillEnterForeground

,210
[self performSelector:@selector(callWebserviceToRefreshData) withObject:nil afterDelay:0.5f]; 

하고 그냥 만들어 인터넷 연결을 안전하게

-(void)callWebserviceToRefreshData { 

     if ([JeebleyHelper isConnected]) { 
     NSLog(@"Yes, network available"); 
     //Call your web service here 
     } else { 
     NSLog(@"No, network not available"); 
     } 
} 

를 확인한 후 웹 서비스를 호출하기 위해이 방법을 추가 당신이 그렇지 않은 경우는, isConnected는 항상 당신에게 이전 상태를 제공합니다 약간의 시간 지연 후 당신의 dataRefresh 메서드를 호출합니다.

+ (BOOL)isConnected { 
    return [AFNetworkReachabilityManager sharedManager].reachable; 
} 
관련 문제