2012-10-01 8 views
19

Ich habe verschiedene Art und Weise getestet, die Möglichkeit zu implementieren zu wissen, ob das Gerät Internet zurück, wenn die App es im Hintergrund ist so der erste Code-I-Test der Apple-Erreichbarkeitsbeispielcode war http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.htmlDetect die Erreichbarkeit im Hintergrund

Aber dieser Code benachrichtigt Internet nicht, wenn die App im Hintergrund ist. Also habe ich versucht, auch den Folowing Code und es funktioniert, wenn App von Hintergrundzustand in dem Vordergrund (das gleiche wie Apple-Erreichbarkeitsbeispielcode) gestartet wird

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

... 
} 


- (void)applicationDidEnterBackground:(UIApplication *)application { 

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

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

} 



- (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"); 

     //Alert sound in Background when App have internet again 
     UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease]; 
     if (notification) { 
      [notification setFireDate:[NSDate date]]; 
      [notification setTimeZone:[NSTimeZone defaultTimeZone]]; 
      [notification setRepeatInterval:0]; 
      [notification setSoundName:@"alarmsound.caf"]; 
      [notification setAlertBody:@"Send notification internet back"]; 
      [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
     } 


     break; 
    } 
    case ReachableViaWWAN: 
    { 
     NSLog(@"The internet is working via WWAN!"); 


     //Alert sound in Background when App have internet again 
     UILocalNotification *notification = [[[UILocalNotification alloc] init] autorelease]; 
     if (notification) { 
      [notification setFireDate:[NSDate date]]; 
      [notification setTimeZone:[NSTimeZone defaultTimeZone]]; 
      [notification setRepeatInterval:0]; 
      [notification setSoundName:@"alarmsound.caf"]; 
      [notification setAlertBody:@"Send notification internet back"]; 
      [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
     } 

     break; 
    } 
} 
} 

Meine Frage ist:Was die Art und Weise informiert werden, wenn Internet Status geändert, wenn die App im Hintergrund ist?

Antwort

2

Ich glaube nicht, dass es eine Möglichkeit gibt, Erreichbarkeitsbenachrichtigungen zu erhalten, während Sie im Hintergrund sind. Der richtige Weg, dies zu umgehen, wäre die Erreichbarkeit in AppDelegate zu überprüfen - (void) applicationWillEnterForeground: (UIApplication *) -Anwendung.

Das einzige Hintergrundereignis, auf das Hintergrund-Apps reagieren, ist der Empfang von Push-Benachrichtigungen, und zwar deshalb, weil das Betriebssystem sie dazu auffordert und nur dann, wenn der Benutzer es anfordert.

-2

Ihre App sollte Multitasking sein (VoIP, LOCATION oder Audio). Und auf diese Weise können Sie das Netzwerk ändern, wenn die App im Hintergrund wechselt.

+1

Hallo, zuerst sollten Sie beachten, dass Apple sehr streng darüber ist, welche Arten von Anwendungen im Hintergrund ausgeführt werden können. Bitte werfen Sie einen Blick auf dieses Dokument von Apple. https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html. Darüber hinaus versuchen Sie bitte zu erklären, was Ihre App versucht zu tun. Vielleicht können wir einen besseren Ansatz bieten! –

7

Live- Sie nicht ändern können, wenn die Netzwerkverbindung geändert, die besten Sie tun können, um es zu machen Arbeit Background Fetch Modus von Capabilities zu verwenden. Firstable Sie müssen das Kontrollkästchen für den Hintergrundmodus überprüfen: enter image description here

Dann müssen Sie für das Zeitintervall fragen so oft wie Sie je früher desto besser können so schlage ich vor application:didFinishLaunchingWithOptions: und Sie müssen diese Zeilen setzen:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; 
    return YES; 
} 

Die UIApplicationBackgroundFetchIntervalMinimum es so oft wie möglich ist, aber es ist nicht genau wie viele Sekunden zwischen Fetches aus der Dokumentation:

Die kleinste holen int erval vom System unterstützt.

Und dann, als Hintergrund, den Sie in AppDelegate mit Methode überprüfen wird Feuer holen können:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    [reachability startNotifier]; 
    NetworkStatus status = [reachability currentReachabilityStatus]; 

    switch (status) { 
     case NotReachable: { 
      NSLog(@"no internet connection"); 
      break; 
     } 
     case ReachableViaWiFi: { 
      NSLog(@"wifi"); 
      break; 
     } 
     case ReachableViaWWAN: { 
      NSLog(@"cellurar"); 
      break; 
     } 
    } 
    completionHandler(YES); 
} 

All dies wird in iOS 7.0 oder höher arbeiten.

+0

Ich habe wie erläutert implementiert .. aber immer noch performFetchWithCompletionHandler nicht aufrufen und konnte nicht die Erreichbarkeit prüfen. – CKT