2011-01-26 16 views
49

Jak wykryć, czy telefon jest w trybie samolotowym? (Nie wystarczy wykryć, że nie ma połączenia z Internetem, muszę być w stanie odróżnić te 2 przypadki).Wykryj tryb samolotowy na iOS

+6

Czy możesz wyjaśnić dlaczego ** ** trzeba odróżnić te dwa przypadki? Jaka jest różnica, jeśli użytkownik nie ma połączenia z powodu zasięgu lub braku połączenia z powodu trybu samolotu? – Jasarien

+12

Gdyż możemy to odróżnić na innych platformach mobilnych i chcielibyśmy mieć tę samą funkcjonalność na różnych platformach, jak to tylko możliwe. W zależności od tego wyświetlamy różne komunikaty o stanie i staramy się pomóc użytkownikowi w rozwiązaniu problemu. – Caner

+7

Wiem, że jest to stare pytanie, ale tylko po to, by wyjaśnić potrzebę tej "wyjątkowo wąskiej sytuacji": kiedy iPhone jest w trybie samolotowym, lokalizacje GPS są wyjątkowo niewiarygodne, ale nie powodują błędów. Subskrybowałem zdarzenia GPS i zostawiłem moją aplikację uruchomioną na 2 godziny. Brak błędów, brak lokalizacji GPS i wszystkie sprawdzenia dotyczące "można odbierać zdarzenia lokalizacji" zwracają TAK. Jednak wyłączenie 3g i wifi ręcznie dało mi NIE dla wewnętrznych czeków "można odebrać lokalizację". Zdecydowanie istnieje potrzeba wyraźnego wykrycia trybu samolotowego w przeciwieństwie do ogólnego sprawdzania osiągalności. – Owen

Odpowiedz

18

Spróbuj użyć SCNetworkReachabilityGetFlags (SystemConfiguration framework). Jeśli zwrócona zmienna flagi wynosi 0, a wartość powrotu to TAK, tryb samolotowy jest włączony.

Sprawdź Apple Reachability classes.

+5

Cześć, zwracana wartość jest TAK i otrzymuję zero w obu tych sytuacjach: 1) Wifi jest wyłączone z ustawień i nie ma karty SIM w telefonie 2) w trybie samolotowym. Więc niestety Twoja sugestia nie rozwiązuje mojego problemu. – Caner

+0

to nie jest stan osiągalności taki sam w obu sytuacjach? ok, status bluetooth może być inny. – Felix

5

Można dodać flagę logiczną SBUsesNetwork do wartości true w pliku Info.plist, aby wyświetlić okno podręczne używane w programie Mail w trybie samolotowym.

+12

Z WYJĄTKIEM, że jest to nieudokumentowane i może pęknąć w przyszłej wersji systemu iOS. –

1

Nie możemy uzyskać tych informacji bez korzystania z prywatnych bibliotek. Oto kod, ale nie zadziała, gdy sygnał operatora nie będzie dostępny.

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

Dla jailbroken usprawnieniach/apps:

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

... 

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