web-dev-qa-db-fra.com

Comment obtenir des notifications d'accessibilité dans iOS en arrière-plan lors de la suppression d'un réseau Wi-Fi?

J'utilise avec succès l'accessibilité pour déterminer l'état du réseau et pour être averti des modifications (par exemple, Guide d'accessibilité pour iOS 4 ).

Ma question n'est pas de savoir comment rendre Accessibilité opérationnelle, mais plutôt ce qui suit.

Ma AppDelegate gère les tâches d'accessibilité. L'application reçoit des notifications (kReachabilityChangedNotification) pendant l'exécution de l'application et lorsque l'application est en arrière-plan (applicationDidEnterBackground:).

L'application est conçue pour recharger un flux audio en cours de lecture lorsqu'elle constate la perte d'une connexion Wi-Fi, par exemple. Pour tester, j'ai activé et désactivé le Wi-Fi dans Paramètres, et tout fonctionnait parfaitement. Lors de tests en conditions réelles, je perds souvent la connectivité Wi-Fi lorsque je quitte la plage du point d'accès. J'ai trouvé que l'accessibilité ne m'aidait pas beaucoup dans ce cas. Je ne sais pas si c'est parce que les notifications d'accessibilité ne s'affichent pas lorsque l'écran est verrouillé, ou si Accessibilité ne gère pas la diminution lente du signal d'un point d'accès Wi-Fi de plus en plus éloigné, mais je ne peux pas comprendre. pourquoi les tests réels ne correspondent pas au cas idéal.

Voici à quoi ressemble mon code. Je me suis d'abord configuré pour recevoir des notifications et commencer à écouter Reachability:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // check for internet connection
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(checkNetworkStatus:) 
                                                 name:kReachabilityChangedNotification object:nil];

    // Set up Reachability
    internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [internetReachable startNotifier];    

    ....

    return YES;
}

et puis, c’est la fonction qui répond aux changements de connectivité:

- (void)checkNetworkStatus:(NSNotification *)notice {
    // called after network status changes

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"The internet is down.");
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI");
            break;            
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN!");
            break;            
        }
    }    
}

Les notifications sont envoyées même lorsque l'application est en arrière-plan, mais pas dans les tests réels décrits ci-dessus.

Merci pour toute aide.

24
Tim Camber

Par défaut, l'application d'état d'arrière-plan ne reste que peu de temps. La plupart des applications passent à l'état suspendu peu de temps après. Cela signifie que l'application est en arrière-plan mais n'exécute pas de code. Par conséquent, votre notification mise en œuvre personnalisée ne fonctionne pas. Doit requérir la réintégration de NetworkReachability à l'heure de réveil dans les méthodes de délégation d'application:

applicationWillEnterForeground:
applicationDidBecomeActive 
5
Arvis

Je travaillais sur une application VoIP, qui est lancée en arrière-plan lors du démarrage de l'iPhone. À ce stade, il est possible que le réseau ne soit plus accessible (par exemple, si le téléphone dispose à la fois d'un code d'authentification et/ou d'une carte SIM avec un PIN code). Mais puisque l'application est lancée directement en arrière-plan, la méthode de délégation applicationDidEnterBackground: n'est pas appelée. Au lieu de cela, j'ai utilisé l'idée de @ Hurden directement dans application:didFinishLaunchingWithOptions, en vérifiant le applicationState pour voir si l'application commençait réellement en arrière-plan. Cela a permis à mon application d’obtenir la notification kReachabilityChangedNotification après le déverrouillage du téléphone (ce qui a permis au WiFi de se connecter à l’aide du mot de passe stocké). 

1
newenglander