Ios 如果在100%的时间内未调用ApplicationIdentinterBackground,那么当我们滑动退出应用程序时,我们如何可靠地保存数据?

Ios 如果在100%的时间内未调用ApplicationIdentinterBackground,那么当我们滑动退出应用程序时,我们如何可靠地保存数据?,ios,objective-c,Ios,Objective C,我早些时候问过这件事。我想我的问题用词不对。基本上,我想在应用程序终止时将数据从我的应用程序保存到解析后端。i、 e.应用程序被从应用程序列表中刷卡并删除。iOS文档表示,实际上将调用ApplicationIdentinterBackground,而不是ApplicationTerminate,因此可以使用此方法完成任何工作 应用程序将终止: 对于不支持后台执行或链接到iOS 3.x或更早版本的应用程序,当用户退出应用程序时,始终调用此方法。对于支持后台执行的应用程序,通常在用户退出应用程序时不

我早些时候问过这件事。我想我的问题用词不对。基本上,我想在应用程序终止时将数据从我的应用程序保存到解析后端。i、 e.应用程序被从应用程序列表中刷卡并删除。iOS文档表示,实际上将调用ApplicationIdentinterBackground,而不是ApplicationTerminate,因此可以使用此方法完成任何工作

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

然而,这并不是100%,从我的测试应用程序来看,每次退出应用程序时都不会调用IdentinterBackground。那么,当应用程序在100%保证其实际保存的情况下终止时,如何保存数据呢

这是我在应用程序标识背景时保存的代码:

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

如果能得到这方面的任何建议,那就太好了。谢谢

您可以使用applicationWillResignActive进行类似的操作。当用户打开他的通知中心时,它也会被调用。当用户进入应用程序切换器时,它也将被调用。如果他随后杀死了应用程序,你对此无能为力,因为从切换器中滑动应用程序将发送SIGKILL。如果幸运的话,您可以利用willResignActive在这之前完成后台任务

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

同时阅读(及以上)

这是解决这个问题的办法。如果你滑动退出你的应用程序,它将 不调用ApplicationIdentinterBackground,因为应用程序已终止。 应用程序终止时要调用的AppDelegate方法为 此方法:


任何你不能在更改时保存而不是“退出”的原因我都在尝试使解析与我的徽章号保持同步(徽章号是我应用程序中的消息数)。每次我删除一条消息来更新对象时,我宁愿在应用程序被放进后台时进行解析,也不愿意每次调用都进行解析。i、 e用户打开应用程序删除3条消息,然后切换应用程序单个api调用以更新徽章计数,而不是3条。嘿,谢谢你这么做,所以如果我将代码移动到应用程序WillResignactive,它应该做同样的事情,但也包括我在应用程序切换器中的时间,对吗?我做了一点测试,因为我只做了一个API调用,你必须是超级人类,才能比执行调用所需的时间更快,所以看起来不错…applicationWillTerminate并不总是被调用,所以这不是一个解决方案。问题清楚地表明,这种方法不起作用,那么发布它的原因是什么?此外,没有理由让应用程序侦听UIApplicationWillTerminateNotification,因为该通知是由applicationWillTerminate发布的。
1.) You need to add the appWillTerminate observer in you app delegate.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//This is the observer you need to add so that the applicationWillTerminate app delegate method will get called.
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

}

2.)Add the codes for saving before your app is terminated.
-(void)applicationWillTerminate:(UIApplication *)application{
//Add your codes like saving data here
}