繁体   English   中英

如果应用程序崩溃,iOS将保存数据

[英]iOS saving data if app crash

我对我的一个项目有要求,在该项目中,用户要求在应用程序突然崩溃的情况下在本地保存数据。 它基于表单的应用程序,因此用户可以在表单中填充大量数据,如果应用程序突然崩溃,则用户将丢失所有输入的数据。

应用正在使用核心数据在本地保存数据。

有一点我们会将输入的数据保存在核心数据中,但是不会在第二个用户填充数据的过程中保存。

同样,如果应用程序崩溃,核心数据也将消失。

实际上,如果您的应用崩溃,则回调:

- (void)applicationWillTerminate:(UIApplication *)application

不会被调用。 仅当出于某些原因系统需要关闭您的应用程序(通常是由于资源稀少或由于后台作业在允许的最大时间后仍在工作)或您使用的是<iOs 4时,才调用此命令。有任何方法可以知道您的应用何时崩溃(但是当您重新启动应用时,您可以知道它是否崩溃了)。

因此,对于您的特殊情况,您有两种解决方案:

  • 可以使用具有高触发速率的NSTimer,或者在每次编辑字段并更新核心数据上下文然后将其保存在磁盘上时调用函数。

     NSError *error = nil; [managedObjectContext save:&error] 

    您是否在上下文中设置了persistentStoreCoordinator? 如果否,核心数据将永远不会在磁盘上保留您的数据。

  • 崩溃不会突然出现,请查找可能发生崩溃的地方并进行修复,或者如果无法修复崩溃,请使用try-catch来保持应用程序运行(但请不要这样做。) )。

希望这个帮助

特别情况下,你可以 应该 使用, try catch块,(但不) 无处不在

try {
   //write your code
}catch(NSException *e){
    //See what's the error
}finally{
    //Save your context
}

这是我认为的最佳解决方案。 但是,您可以创建一个NSTimer ,该NSTimer在合理的时间执行一个方法,以保存和保存上下文。

您还可以将上下文保存为AppDelegate的方法,例如(如果您定位的是iOS 4.0及更高版本,并且如果您的应用由于某种原因被iOS自身退出),

- (void)applicationWillTerminate:(UIApplication *)application{};

当您的应用在后台运行时,以下方法将始终调用,

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

您可以实现HandleException来捕获使应用程序崩溃的所有异常。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //for uncaughted exceptions
    NSSetUncaughtExceptionHandler(&HandleException);

    struct sigaction signalAction;
    memset(&signalAction, 0, sizeof(signalAction));
    signalAction.sa_handler = &HandleSignal;

    sigaction(SIGABRT, &signalAction, NULL);
    sigaction(SIGILL, &signalAction, NULL);
    sigaction(SIGBUS, &signalAction, NULL);
    //and more if you need to handle more signals    


    //another setup ...
    return YES
}

#pragma mark crash management
void HandleException(NSException *exception) {
    NSLog(@"[FALTAL] App crashing with exception: %@", exception);
    //try to save your DB here.
}

void HandleSignal(int signal) {
    //try to save your DB here.
}

#pragma -

但是,我不知道退出应用程序之前需要多少时间。 但是我想您将有足够的时间来执行数据库备份任务。

采用

  • (void)applicationWillTerminate:(UIApplication *)应用程序

AppDelgate的委托方法可将您的数据保存在核心数据中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM