2012-11-06 17 views
5

Próbuję zaimplementować Zasięg w mojej aplikacji. Mam go w applicationDidFinishLaunching. Jeśli moje połączenie jest naprawdę złe i uruchomię aplikację, osiągalność będzie trwała wiecznie i często powoduje awarię aplikacji z komunikatem o błędzie The application failed to launch in time.Gdzie umieszczasz swój telefon na Dostępności?

Zamiast tego próbowałem umieścić wywołanie funkcji osiągalnej w wątku tła. Ale kiedy to zrobię, nie będę już otrzymywać powiadomień o zasięgu.

Gdzie powinienem dzwonić?

Edit:

dodałem kod TonyMillions' osiągalności za poniżej sugestii, ale ja wciąż otrzymuję ten sam błąd, gdy application failed to load in time w bardzo złych warunkach sieciowych. Aby odtworzyć to, co widzę, przejdź do Settings.app -> Deweloper -> Network Link Conditioner, włącz go i ustaw na 100% strat.

Czy Twoja aplikacja nadal jest załadowana w takim stanie?

Odpowiedz

0

TonyMillion pomógł mi rozwiązać ten problem w ciągu dnia GitHub .

Jeśli używasz jego wymianę osiągalność, wszystko co musisz zrobić, to owinąć połączenia startNotifier tak:

dispatch_async(dispatch_get_global_queue(0,0), ^{ 
    [self.internetReach startNotifier]; 
}); 

Aplikacja nie zawiedzie, aby uruchomić w złych warunkach sieciowych i będziesz nadal otrzymuję powiadomienia w głównym wątku.

0

Dlatego zamiast wywołać wywołanie funkcji dostępności w wątku tła. Ale kiedy to zrobię, nie będę już otrzymywać powiadomień o zasięgu.

Po wywołaniu funkcji Dostęp w wątku w tle należy zaplanować dostęp w pętli działającej w tle i upewnić się, że uruchomiona jest pętla wątku tła.

do wykonania nici tle:

  1. utworzyć obiektu reachbility,

    osiągalności osiągalności * = [osiągalności reachabilityWithHostName: @ "www.google.com"];

  2. [wskaźnik komunikacyjny startability];

  3. [[NSRunLoop currentRunLoop] uruchom];

Może to działać, ale zalecany jest notyfikator w głównym wątku.

2

Użyj projektu osiągalności Tony Millions na Github.

https://github.com/tonymillion/Reachability

Wtedy w moim app delegata po prostu umieścić w applicationdidfinishlaunching

self.reachability = [Reachability reachabilityForInternetConnection]; 

[self.reachability startNotifier]; 

wtedy, gdy stan zmienia to zostanie wywołana

#pragma mark - Reachability 

- (void)reachabilityChanged:(NSNotification *)note { 

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus]; 

    if (ns == NotReachable) { 

     if (![self.networkAlert isVisible]) { 

      if ([self networkAlert] == nil) { 

       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; 
       [self setNetworkAlert:alert]; 
      } 

      [self.networkAlert show]; 
     } 
    } else { 

     if ([self networkAlert] != nil) { 

      [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
     } 
    } 
} 
+0

W końcu wracam do testowania tego teraz. Dodałem kod dostępu TonyMillions, ale wciąż otrzymuję ten sam błąd "aplikacja nie załadowała się w czasie" z bardzo złymi warunkami sieci. Spróbuj przejść do Settings.app -> Deweloper -> Network Link Conditioner, włącz go i ustaw na 100% strat. Czy twoja aplikacja wciąż jest ładowana w tym stanie? – bmueller

+0

Tak. Żadnych problemów ... z wyjątkiem awarii sieci oczywiście ... – Hackmodford

Powiązane problemy