applicationDidEnterBackground und applicationWillEnterForeground-Methode nicht aufgerufen, wenn gedrückt, home button in iOS simulator
Brauche ich eine lange laufende Aufgabe erledigt im hintergrund als auch im Vordergrund. Dies aktualisiert die Stammdaten. So pflegen UI-responsive erstellte ich ein einem anderen thread wo ich verschiedene managedObjectContext(MOC). So ein timer ist gesetzt, im hintergrund sowie im Vordergrund und inaktiviert ist angemessen, wenn sich der Zustand ändert. Bevor die Aufgabe gestartet wird, und nachdem die Aufgabe abgeschlossen ist, wenn ich drücken Sie die home-Taste ruft die beiden delegate-Methoden richtig, aber während der Auftrag aktiv ist, wenn ich drücken Sie die Taste home Bildschirm wechselt und UI hängt sich auf (leer) aber die beiden delegate-Methoden sind nicht ordnungsgemäß aufgerufen und die app wird nicht beendet. Ich konnte den Grund nicht finden, warum dies so geschieht. Es wäre hilfreich, wenn jemand helfen kann.
Werde ich befestigen Sie den benötigten code mit diesem :
-(void) startTimerThread
{
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
//Add code here to do background processing
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[(AppDelegate *)[[UIApplication sharedApplication] delegate] persistentStoreCoordinator]];
self.managedObjectContext = context;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:context];
NSLog(@"managedObjContext : %@\n",self.managedObjectContext);
[self getDataFromFile];
dispatch_async( dispatch_get_main_queue(), ^{
//Add code here to update the UI/send notifications based on the
//results of the background processing
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];
[context release];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:context];
});
});
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Background\n");
[self.notificationTimer invalidate];
self.notificationTimer = nil;
UIApplication *app = [UIApplication sharedApplication];
self.bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
//start location update timer and background timer
self.timer = [NSTimer scheduledTimerWithTimeInterval:180 target:self
selector:@selector(startLocationServices) userInfo:nil repeats:YES];
self.locationManager.delegate = self;
[self.locationManager startUpdatingLocation];
self.logDownloader.managedObjectContext = self.managedObjectContext;
NSLog(@"managedObjContext : %@\n",self.logDownloader.managedObjectContext);
self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:90 target:self.logDownloader selector:@selector(getDataFromFile) userInfo:nil repeats:YES];
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Foreground\n");
//invalidate background timer and location update timer
[self.timer invalidate];
[self.backgroundTimer invalidate];
self.timer = nil;
self.notificationTimer = nil;
self.logDownloader.managedObjectContext = self.managedObjectContext;
NSLog(@"managedObjContext : %@\n",self.logDownloader.managedObjectContext);
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];
self.notificationTimer = [NSTimer scheduledTimerWithTimeInterval:180 target:self.logDownloader selector:@selector(startTimerThread) userInfo:nil repeats:YES];
}
InformationsquelleAutor aparna | 2013-03-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum
applicationDidEnterBackground:
undapplicationDidEnterForeground:
sind nie aufgerufen wird, weil diese Methoden werden verwendet, in Verbindung mitAnwendung läuft nicht im hintergrund
diese option finden Sie in Ihrem***-info.plist
. Wenn diese option gesetzt istYES
als Ihre app wird nie diese Methoden aufrufen, da diese, wenn Sie drücken Sie die home-Taste mit einer app, setzen Sie die option aufYES
die Instanz der app, die ausgeführt wird, abgebrochen, so dass jedes mal, wenn Sie drücken Sie die Taste home und wählen Sie dann das app-Symbol wird eine neue Instanz erstellt wird, so ist es mitapplicationWillTerminate:
.Den Methoden, die
Kirti mali
gesagt hat, wäre auch die falsche Methoden verwenden wollen, sind Sie nach, der Grund dafür ist, dassapplicationDidBecomeActive:
undapplicationWillResignActive:
werden verwendet, wenn etwas, wie wenn Sie einen Telefonanruf entgegenzunehmen. Die Instanz wird nicht beendet, weder ist es an den hintergrund. Die Instanz ist angehalten, bis der Benutzer beendet hat, auf das rufen, wenn es wieder aktiv.Also die Lösung zu sein, wenn Sie möchten, dass die app im hintergrund laufen würde, um die option zu ändern "
Application does not run in background
" in der***-info.plist to be
KEINEjust
applicationDidBecomeActive:and
applicationWillResignActive:` ist der falsche Weg für diese Methoden verwendet werden.Bitte finden Sie in der apple-Dokumentation auf
UIApplicationDelegate
, um ein besseres Verständnis dieser Methoden.Einige
NSLogs
laufen auf einemNSTimers
, aber Sie wissen, wenn Sie gesendet wurde, in den hintergrund, weil einmal kommen Sie zurück zu der app, die app-Instanz ausgeführt wurde, wird fortgesetzt.Nur stellen Sie sicher, dass Sie "Anwendung läuft nicht im hintergrund" auf NEIN und es wird im hintergrund laufen.
Nein eigentlich meine Bewerbung bekommen sollte, location updates alle 5 Minuten, so dass es nicht geht suspend-Zustand. Im Grunde mehr wie ein mail-client, überprüfen Sie die server für ein paar updates, um Benutzer zu Benachrichtigen dementsprechend, wenn es in den hintergrund. Anstelle der Verwendung von Push-Benachrichtigungen habe ich es mit lokalen notification + Ort-service. So kann ich nicht machen "- App läuft nicht im hintergrund" auf NEIN. Gibt es irgendeine andere option zu tun
Ich werde Nein sagen, zumindest auch nicht alles, was ich darüber weiß.
InformationsquelleAutor Popeye
Diese Methode wird aufgerufen, wenn home-Taste gedrückt wird
und diese Methode wird aufgerufen, wenn die Schaltfläche gedrückt wird
Ich bezog mich paar Seiten, die erklärte, tat diese Methoden werden aufgerufen, gefolgt von der -(void)applicationDidBecomeActive:(UIApplication *)application-und - (void)applicationWillResignActive:(UIApplication *)application cocoanetics.com/2010/07/... und s3-ap-northeast-1.amazonaws.com/booksikindle/html/....
ja, es funktioniert gut
InformationsquelleAutor kirti Chavda