Определить режим полета на iOS

Как я могу определить, находится ли телефон в режиме полета? (Недостаточно обнаружить, что нет подключения к интернету, я должен быть в состоянии различить эти 2 случая)

4 ответа

Попробуйте использовать SCNetworkReachabilityGetFlags (SystemConfiguration Framework). Если переменная флагов, переданная обратно, равна 0, а возвращаемое значение - ДА, режим полета включается.

Проверьте классы доступности Apple.

Вы можете добавить логический флаг SBUsesNetwork, установленный в true, в свой Info.plist, чтобы отобразить всплывающее окно, используемое в Mail в режиме полета.

Начиная с iOS 12 и Network Framework, можно каким-то образом определить, активен ли режим полета.

import Network

let monitor = NWPathMonitor()

monitor.pathUpdateHandler = { path in
    if path.availableInterfaces.count == 0 { print("Flight mode") }
    print(path.availableInterfaces)
}

let queue = DispatchQueue.global(qos: .background)
monitor.start(queue: queue)

path.availableInterfaces возвращает массив. Например [en0, pdp_ip0], Если нет доступного интерфейса, возможно, в режиме полета.

ВНИМАНИЕ! Если активен режим полета и Wi-Fi, path.availableInterfaces не пусто, потому что он возвращается [en0]

Для джейлбрейкнутых твиков / приложений:

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

...

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

Мы не можем получить эту информацию без использования частных библиотек. Вот некоторый код, но он не будет работать, когда сигнал несущей недоступен.

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");
  }
Другие вопросы по тегам