Determinare quando ritorna una connessione EDGE dopo un dropout su un iPhone
-
05-07-2019 - |
Domanda
Ho incorporato l'esempio di raggiungibilità di Apple nel mio progetto, quindi so se ho una connessione di rete - se non ho una connessione di rete, non mi preoccupo di inviare e richiedere. Ho deciso di seguire l'implementazione della notifica dello stato perché mi è sembrato più facile avere la raggiungibilità aggiornata in background e avere i risultati attuali disponibili immediatamente invece di dare il via a una richiesta sincrona ogni volta che voglio fare una connessione di rete.
Il mio problema è che comincio a ricevere falsi negativi su una rete EDGE: il telefono ha connettività, ma l'app pensa che non sia così. La mia comprensione è che non ricevi una notifica quando una connessione EDGE, quindi la mia ipotesi è che a un certo punto ho perso e riguadagnato la connessione. Il riavvio dell'app è in genere sufficiente per visualizzare la connessione di rete.
Questa non è una soluzione ottimale, quindi mi chiedevo se qualcun altro avesse riscontrato questo problema e avesse qualche idea su una soluzione.
(Non so se questo si applica anche al 3G; sto usando un iPhone di prima generazione).
Soluzione
Le notifiche di raggiungibilità non sembravano essere affidabili nemmeno per me, per il rilevamento del Wi-Fi. Quindi uso semplicemente il polling. Il controllo ogni 5 secondi sembra non danneggiare.
- (void) checkReachability {
BOOL connected = ([[Reachability sharedReachability] localWiFiConnectionStatus] == ReachableViaWiFiNetwork);
// Do something...
[self performSelector:@selector(checkReachability) withObject:nil afterDelay:5.0];
}
Altri suggerimenti
C'è un buon esempio di raggiungibilità in rete. funziona meravigliosamente bene: http://servin.com/iphone/iPhone-Network-Status.html
Ma vedi, quando provo ad usarlo a modo mio, si scatena una bomba.
Ho provato a implementarlo usando:
NSString *sCellNetwork;
NSString *sNetworkReachable;
if (flags & kSCNetworkFlagsReachable || flags & kSCNetworkReachabilityFlagsIsWWAN)
{do it}
else {
Network fail alert;
}