60 votes

Détecter le mode avion sur iOS

Comment 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) ?

6 votes

Pouvez-vous expliquer pourquoi vous devez distinguer ces deux cas ? Quelle différence cela fait-il si l'utilisateur n'a aucune connexion à cause de la couverture ou aucune connexion à cause du mode avion ?

14 votes

Parce que nous pouvons le distinguer sur d'autres plateformes mobiles et nous aimerions avoir la même fonctionnalité sur toutes les plateformes autant que possible. Nous affichons différents messages d'état en fonction du problème et nous essayons de guider l'utilisateur pour qu'il le corrige.

9 votes

Je sais que c'est une vieille question, mais juste pour clarifier le besoin de cette "situation extraordinairement étroite" : Lorsqu'un iPhone est en mode avion, les positions GPS sont extrêmement peu fiables, mais ne provoquent pas d'erreurs. Je me suis abonné aux événements GPS et j'ai laissé mon application fonctionner pendant 2 heures. Pas d'erreur, pas de localisation GPS, et toutes les vérifications pour 'can receive location events' retournent YES. Cependant, en désactivant manuellement la 3g et le wifi, j'ai obtenu un NON pour les vérifications internes "peut recevoir une localisation". Il est certainement nécessaire de détecter explicitement le mode avion plutôt que de procéder à une vérification générale de l'accessibilité.

19voto

phix23 Points 24407

Essayez d'utiliser SCNetworkReachabilityGetFlags (cadre SystemConfiguration). Si la variable flags remise est 0 et que la valeur de retour est YES, le mode avion est activé.

Consultez le site d'Apple Classes d'accessibilité .

7 votes

Bonjour, la valeur de retour est YES et j'obtiens zéro dans ces deux situations : 1) le Wifi est désactivé dans les paramètres et il n'y a pas de carte sim dans le téléphone 2) le mode avion. Donc malheureusement votre suggestion ne résout pas mon problème.

0 votes

L'état d'accessibilité n'est-il pas le même dans les deux situations ? ok, l'état bluetooth pourrait être différent.

0 votes

Le choix du terme "accessibilité" par Apple est malheureux. Il s'agit plutôt de "suis-je connecté maintenant" que de "serai-je joignable à l'avenir". Une application pourrait s'en soucier parce que si vous êtes en mode avion, vous ne serez pas joignable à l'avenir. Le message que vous avez envoyé ne recevra pas de réponse, l'invitation à un jeu ne pourra pas être acceptée, etc.

5voto

Zac White Points 198

Vous pouvez ajouter l'indicateur booléen SBUsesNetwork défini sur true dans votre Info.plist pour afficher le popup utilisé dans Mail en mode avion.

13 votes

SAUF que ceci n'est pas documenté et peut se briser dans une future version d'iOS.

3voto

BilalReffas Points 3239

Depuis iOS 12 et le 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, il est probablement en mode vol.

AVERTISSEMENT Si le mode avion et le wifi sont actifs alors path.availableInterfaces n'est pas vide, car il renvoie [en0]

2voto

Clawish Points 486

Pour les tweaks/apps jailbreakés :

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

...

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

1voto

Vikash Rajput Points 423

Nous ne pouvons pas obtenir ces informations sans utiliser les bibliothèques privées. Voici un code mais il ne fonctionnera pas si le signal de la porteuse 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");
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X