web-dev-qa-db-fra.com

Détecter le mode avion sur iOS

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)

56
Caner

Essayez d'utiliser SCNetworkReachabilityGetFlags (framework SystemConfiguration). Si la variable drapeaux restituée est 0 et la valeur de retour est OUI, le mode avion est activé.

Découvrez les classes d'accessibilité d'Apple .

20
Felix

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.

5
Zac White

Pour les réglages/applications jailbreakés:

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

...

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

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");
  }
1
Vikash Rajput

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]

0
BilalReffas