当我们滑动退出应用程序时,如果 applicationDidEnterBackground 没有 100% 被调用,我们如何可靠地保存数据?

Kex*_*Kex 5 objective-c ios

我之前问过这个问题。我想我的问题措辞错误。基本上我想在应用程序终止时将数据从我的应用程序保存到解析后端。即该应用程序被从应用程序列表中删除并杀死。iOS 文档说,实际上 applicationDidEnterBackground 将被调用,而不是 applicationWillTerminate,因此可以在此方法中完成任何工作。

applicationWillTerminate:对于不支持后台执行或链接到 iOS 3.x 或更早版本的应用程序,当用户退出应用程序时始终调用此方法。对于支持后台执行的应用程序,当用户退出应用程序时通常不会调用此方法,因为在这种情况下应用程序只是移动到后台。但是,当应用程序在后台运行(未挂起)并且系统因某种原因需要终止它的情况下,可能会调用此方法。

然而,这并不是 100%,并且从我的测试 applicationDidEnterBackground 来看,每次退出应用程序时都不会调用。那么,当应用程序终止时,如何保存数据并保证 100% 确实保存数据呢?

这是我在 applicationDidEnterBackground 时保存的代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
 {
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
        //End the Task
        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if([self getController]){                
            CatsViewController *catsViewController = [self getController];
            if(catsViewController.currentUser){                    
                int count = (int)[MyViewController.currentUser.messages count];
                PFInstallation *currentInstallation = [PFInstallation currentInstallation];
                currentInstallation.badge = count;
                [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
                    [application endBackgroundTask:bgTask];
                    bgTask = UIBackgroundTaskInvalid;
                }];                    
            }                
            else{                    
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
        }            
        else{                
            [application endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

如果能得到这方面的任何指示就太好了。谢谢

小智 5

您可以使用 applicationWillResignActive 来完成类似的事情。它还有一个额外的好处,就是当用户打开通知中心时也会被调用。当用户进入应用程序切换器时也会调用它。如果他随后杀死了该应用程序,您将无能为力,因为从切换器上滑动该应用程序将发送 SIGKILL。如果幸运的话,您可以使用 willResignActive 在此之前完成后台任务。

我总是分别使用 applicationWillResignActive 和 applicationDidBecomeActive ,因为它们都涵盖了应用程序不在前台的更广泛的情况。

另请阅读此处的答案(以及上面)