Dove devo eseguire un controllo di raggiungibilità?
-
08-10-2019 - |
Domanda
Voglio verificare la presenza di una connessione di rete valida. Ho seguito ad esempio di raggiungibilità di Apple e mettere il mio check-in applicationDidFinishLaunching
#pragma mark -
#pragma mark Application lifecycle
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
{
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
}
// Override point for customization after application launch.
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
//Check for connectivity
internetReach = [[Reachability reachabilityForInternetConnection] retain];
[internetReach startNotifer];
[self updateInterfaceWithReachability: internetReach];
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
return YES;
}
Tuttavia, la mia app andrà in crash a volte con l'Application Failed to Launch in Time
errore
ho postato il mio incidente come una questione ecco: è riuscito a lanciare in Time
non sono sicuro dove dovrei eseguire il controllo di raggiungibilità?
Soluzione
In -applicationDidBecomeActive
si può chiamare un metodo di in background che utilizza il codice di raggiungibilità con -performSelectorInBackground:withObject:
.
Altri suggerimenti
Un controllo raggiungibilità potrebbe richiedere una quantità significativa di tempo (30 secondi o più) a seconda delle condizioni della rete. Ma se la UI della tua applicazione non risponde per un determinato numero di secondi (meno di 30), il sistema operativo presuppone che è morto e lo uccide.
Se fate il vostro assegno di raggiungibilità in un thread in background, non il thread dell'interfaccia utente, allora la vostra interfaccia utente rimarrà reattivo, e né il sistema operativo, né l'utente si assume che la vostra applicazione è bloccato o si è schiantato.