it-swarm.com.de

Wie erhalte ich Erreichbarkeitsbenachrichtigungen in iOS im Hintergrund, wenn ich ein Wi-Fi-Netzwerk lösche?

Ich verwende Reachability erfolgreich, um den Status des Netzwerks zu ermitteln und über Änderungen informiert zu werden (z. B. Reachability Guide für iOS 4 ).

Meine Frage ist nicht, wie man Reachability zum Laufen bringt, sondern die folgende.

Meine AppDelegate kümmert sich um die Erreichbarkeit. Die App erhält Benachrichtigungen (kReachabilityChangedNotification), während die App ausgeführt wird und wenn sich die App im Hintergrund befindet (applicationDidEnterBackground:).

Die App wurde entwickelt, um einen wiedergegebenen Audiostream neu zu laden, wenn sie feststellt, dass eine Wi-Fi-Verbindung unterbrochen wurde, z. Zum Testen habe ich WLAN in den Einstellungen aktiviert und deaktiviert, und alles hat perfekt funktioniert. Beim Testen in der Praxis wird die Wi-Fi-Verbindung häufig unterbrochen, wenn ich den Bereich des Zugriffspunkts verlasse. Ich habe festgestellt, dass die Erreichbarkeit mir in diesem Fall nicht allzu viel hilft. Ich bin nicht sicher, ob es daran liegt, dass die Erreichbarkeitsbenachrichtigungen nicht eingehen, wenn der Bildschirm gesperrt ist, oder ob Reachability das langsame Verringern des Signals von einem immer weiter entfernten Wi-Fi-Zugangspunkt nicht verarbeitet, aber ich kann es nicht herausfinden Finden Sie heraus, warum das Testen in der Praxis nicht zum idealisierten Fall passt.

So sieht mein Code aus. Ich richte mich zuerst ein, um Benachrichtigungen zu erhalten, und beginne, Reachability zu hören:

- (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;
}

und dann ist dies die Funktion, die auf Änderungen in der Konnektivität reagiert:

- (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;            
        }
    }    
}

Die Benachrichtigungen werden auch dann gesendet, wenn sich die App im Hintergrund befindet, jedoch nicht in den oben beschriebenen Tests in der realen Welt.

Danke für jede Hilfe.

24
Tim Camber

Standardmäßig bleibt die App nur für kurze Zeit im Hintergrund, die meisten Apps werden kurz danach in den angehaltenen Status versetzt. Dies bedeutet, dass sich die App im Hintergrund befindet, jedoch keinen Code ausführt. Ihre benutzerdefinierten Benachrichtigungen funktionieren daher nicht. Sie müssen NetworkReachability zum Zeitpunkt des Aufwachens in App-Delegat-Methoden anfordern:

applicationWillEnterForeground:
applicationDidBecomeActive 
5
Arvis

Ich habe an einer VoIP-App gearbeitet, die beim Hochfahren des iPhones im Hintergrund gestartet wird. Zu diesem Zeitpunkt ist möglicherweise keine Netzwerkerreichbarkeit möglich (z. B. wenn das Telefon über einen Passcode und/oder eine SIM-Karte mit einer PIN code). Da die App jedoch direkt im Hintergrund gestartet wird, wird die Delegatmethode applicationDidEnterBackground: nicht aufgerufen. Stattdessen benutzte ich @ Hurdens Idee direkt in application:didFinishLaunchingWithOptions und überprüfte die applicationState, um zu sehen, ob die App tatsächlich im Hintergrund gestartet wurde. Dies ermöglichte meiner App, die Benachrichtigung kReachabilityChangedNotification zu erhalten, nachdem das Telefon entsperrt wurde (wodurch das WLAN eine Verbindung mit dem gespeicherten Passwort herstellen konnte). 

1
newenglander