Определить режим полета на 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");
}