2012-10-22 7 views
2

AppDelegate의 클래스 A에서 선택기를 수행하려고합니다.도달 가능성 거짓 긍정 문제

사용자에게 앱을 구입하자마자 즉시 모든 콘텐츠를 다운로드하고 나중에 캐싱하도록 경고하는 알림을 설정합니다.

나는 A 클래스와 정확히 일치하며 실제로 잘 작동합니다.

이제 내가 처음 출시 할 때 도달 가능성은 내가 실제로 온라인 상태 일 때 나는 오프라인이라고 말합니다.

콘텐츠는 3G (데이터 요금 절약)가 아닌 WiFi를 통해서만 다운로드 할 수 있지만 내 WiFi 네트워크에 있더라도 오프라인이라고 표시됩니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if (![defaults objectForKey:@"mainLaunch"]){ 
    [self performSelector:@selector(askForDownloadContentsAtFirstStart) withObject:nil afterDelay:0.5]; 
    [defaults setObject:[NSDate date] forKey:@"mainLaunch"]; 


    //... 
    } 


-(void)askForDownloadContentsAtFirstStart{ 
    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Download contents" message:@"blahblahblah" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]autorelease]; 
    [alert show]; 
} 


-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if (buttonIndex == 0){ 
     [alertView dismissWithClickedButtonIndex:0 animated:YES]; 
    }else{ 
     aVc = [[AViewController alloc]init]; 
     [aVc performSelector:@selector(offlineDownload:)]; 
    } 
} 

그리고 내 AVC에서 다음 중 하나 :

- (void)viewWillAppear:(BOOL)animated 
{ 
    internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(offlineDownload:) 
               name:kReachabilityChangedNotification object:nil]; 
} 

    - (IBAction)offlineDownload:(id)sender{ 
     UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Warning!" message:@"Blahblahblah" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]autorelease]; 
     [alert show]; 
    } 


    -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ 
     if (buttonIndex == 0){ 
      [alertView dismissWithClickedButtonIndex:0 animated:YES]; 
     } 
     else{ 
      NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
      switch (internetStatus) { 
       case NotReachable: 
       { 
        NSLog(@"Offline"); 
       } 
       case (ReachableViaWWAN): 
       { 
        NSLog(@"3G"); 
       } 
       case (ReachableViaWiFi):{ 
        HUD = [[MBProgressHUD showHUDAddedTo:key_Window animated:YES]retain]; 
        HUD.delegate = self; 
        HUD.dimBackground = YES; 
        HUD.labelText = NSLocalizedString(@"Connecting",@"Connecting..."); 
        NSURL *URL = [NSURL URLWithString:NSLocalizedString(@"plistUrl",@"")]; 
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; 
        [request addValue:@"" forHTTPHeaderField:@"Accept-Encoding"]; 
        NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
        [connection start]; 
        [connection release]; 
        break; 
       } 

       default: 
        break; 
      } 

     } 
    } 

이 문제는 다시 일어난하지만 internetReachable를 유지하여 해결 나는 앱 위임에 다음 코드를 사용하고

. 자, 작동하지 않는 것 같습니다!

아이디어가 있으십니까?

+0

이것은 수많은 도달 가능성 질문이 중복되어 있습니다. 도달 가능성은 인터넷 연결 여부를 알려주지 않습니다. –

답변

3

:

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

을 그리고 신고자 시작 :

[[Reachability reachabilityForLocalWiFi] startNotifier]; 

그리고 무선 랜을 사용할 수 있는지 테스트 할 수 있습니다 알림 리스너의 :

- (void) reachabilityChanged: (NSNotification*)note 
{ 
    Reachability* curReach = [note object]; 
    NetworkStatus netStatus = [curReach currentReachabilityStatus]; 
    if(netStatus == ReachableViaWiFi) { 
     // wifi available 
     [self askForDownloadContentsAtFirstStart]; 
    } 
} 
+0

이 코드를 AppDelegate 또는 A 클래스에 넣으려고 할 수 있습니까? didFinishLaunchingWithOptions에서 앱 위임의 – Phillip

+0

을 사용하면 옵저버를 추가하고 알리미를 시작합니다. –

+0

오케이. 그래서 나는 옳은 것을 짐작했다. 그러나 alertView 대리자 메서드와 어떻게 결합 될 수 있습니까? 내 말은, 사용자가 "예"를 누르고 Wi-Fi만을 사용하는 경우에만이 작업을 실행해야합니다. – Phillip

1

Reachability가 앱이 시작되자 마자 올바른 것이라고 생각하지 않습니다. 우리의 솔루션은 알림을 모니터링하고 성공적인 연결이보고 될 때까지 기다린 다음 거기에서 상황을 처리하는 것이 었습니다.

우리의 애플 리케이션은 또한 internetReachablestartNotifier를 호출 한 후 에 도달주의 - (무효) reachabilityChanged : (NSNotification)은 Notification * 콜백. 관리자 클래스에서이 작업을 수행하여 현재 연결 가능성을 확인할 수 있으며 연결 가능성이 변경되면 필요한 경우 나머지 앱에도 알림을 보낼 수 있습니다.

당신은 너무처럼 kReachabilityChangedNotification 통지 관찰자를 추가 할 수
+0

시작시에 사용자가 옵션을 활성화하면 자동으로 새로운 내용을 다운로드하는 뭔가가 이미 있습니다. 왜 지금은 효과가 없는지 모르겠다. 재미있는 점은 첫 번째 연결 가능성 (자동 다운로드의 경우)이 연결을 활성으로보고하고 두 번째 연결은 오프라인 상태를보고한다는 것입니다. 오, 그래서 일종의 세계적인 수업을 만들었습니까? – Phillip

+0

네, 기본적으로 앱의 나머지 부분에서 사용할 수있는 연결 가능성을 쿼리하여보다 의미있는 알림을 보낼 수있는 것으로 포장합니다. 또한 우리는 앱과 Reachability 코드의 상호 작용을 단일 클래스로 제한합니다. –