Comment puis-je détecter si le téléphone est en mode avion? (Il ne suffit pas de détecter qu'il n'y a pas de connexion internet, je dois pouvoir distinguer ces 2 cas)
Vous pouvez ajouter l'indicateur booléen SBUsesNetwork défini sur true dans votre Info.plist pour afficher la fenêtre contextuelle utilisée dans Mail en mode avion.
Pour les réglages/applications jailbreakés:
@interface SBTelephonyManager : NSObject
+(id)sharedTelephonyManager;
-(BOOL)isInAirplaneMode;
@end
...
bool isInAirplaneMode = [[%c(SBTelephonyManager) sharedTelephonyManager] isInAirplaneMode];
Nous ne pouvons pas obtenir ces informations sans utiliser des bibliothèques privées. Voici du code, mais cela ne fonctionnera pas lorsque le signal porteur n'est pas disponible.
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");
}
Depuis iOS 12 et Network Framework, il est en quelque sorte possible de détecter si le mode avion est actif.
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
renvoie un tableau. Par exemple [en0, pdp_ip0]
. Si aucune interface n'est disponible, c'est probablement en mode avion.
AVERTISSEMENT Si le mode avion et le wifi sont actifs, alors path.availableInterfaces
n'est pas vide, car il renvoie [en0]