2011-01-26 18 views
49

Come posso rilevare se il telefono è in modalità aereo? (Non è sufficiente rilevare che non vi è alcuna connessione Internet, devo essere in grado di distinguere questi 2 casi)Rileva modalità aereo su iOS

+6

Vuoi spiegarci il motivo ** ** è necessario distinguere questi due casi? Che differenza fa se l'utente non ha una connessione a causa della copertura o della mancanza di connessione a causa della modalità aereo? – Jasarien

+12

Possiamo distinguerlo su altre piattaforme mobili e vorremmo avere la stessa funzionalità su tutte le piattaforme il più possibile. A seconda di ciò, mostriamo messaggi di stato diversi e cerchiamo di guidare l'utente a correggere il problema. – Caner

+7

So che questa è una vecchia domanda, ma solo per chiarire la necessità di questa "situazione straordinariamente stretta": quando un iPhone è in modalità aereo, le posizioni GPS sono estremamente inaffidabili, ma non causano errori. Mi sono iscritto agli eventi GPS e ho lasciato la mia app in esecuzione per 2 ore. Nessun errore, nessuna posizione GPS e tutti i controlli per "può ricevere gli eventi di localizzazione" restituire SI. Tuttavia, disabilitando 3g e wifi manualmente mi ha dato NO per i controlli interni "può ricevere la posizione". È assolutamente necessario rilevare la modalità aereo in modo esplicito rispetto a un controllo generale della raggiungibilità. – Owen

risposta

18

Provare a utilizzare SCNetworkReachabilityGetFlags (framework SystemConfiguration). Se la variabile flags restituita è 0 e il valore restituito è YES, la modalità aereo è attivata.

Scopri Apple Reachability classes.

+5

Salve, il valore restituito è SÌ e ottengo zero in entrambe le situazioni: 1) Wifi è disabilitato dalle impostazioni e non c'è nessuna scheda SIM nel telefono 2) modalità aereo. Quindi sfortunatamente il tuo suggerimento non risolve il mio problema. – Caner

+0

non è lo stato di raggiungibilità uguale in entrambe le situazioni? ok, lo stato del bluetooth potrebbe essere diverso. – Felix

5

È possibile aggiungere il flag booleano SBUsesNetwork impostato su true in Info.plist per visualizzare il popup utilizzato in Mail in modalità aereo.

+12

TRANNE che questo non è documentato e potrebbe rompersi in una versione futura di iOS. –

1

Non possiamo ottenere queste informazioni senza utilizzare librerie private. Ecco un codice ma non funzionerà quando il segnale portante non è disponibile.

UIApplication *app = [UIApplication sharedApplication]; 
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; 

NSString *dataNetworkItemView = nil; 

for (id subview in subviews) { 
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) { 
      dataNetworkItemView = subview; 
      break; 
    } 
} 
double signalStrength = [[dataNetworkItemView valueForKey:@"signalStrengthRaw"] intValue]; 
if (signalStrength > 0) { 
     NSLog(@"Airplane mode or NO signal"); 
    } 
    else{ 
     NSLog(@"signal available"); 
    } 
1

Per tweaks jailbroken/apps:

@interface SBTelephonyManager : NSObject 
+(id)sharedTelephonyManager; 
-(BOOL)isInAirplaneMode; 
@end 

... 

bool isInAirplaneMode = [[%c(SBTelephonyManager) sharedTelephonyManager] isInAirplaneMode]; 
Problemi correlati