Iphone 应用程序将在调用和未调用时终止

Iphone 应用程序将在调用和未调用时终止,iphone,ios4,Iphone,Ios4,您好,我已经阅读了一些关于应用程序将终止被呼叫和不被呼叫的问题 我想总结一下我的理解,因为有几篇帖子的表达方式不同 对于IOS(无多任务处理),当按下home(主页)按钮时,它总是被调用 适用于IOS 4及以上版本 a。当按下home(主页)按钮时(当应用程序移到后台时),它不会被调用 b。从多任务驳接关闭应用程序时会调用它,如果应用程序在info.plist disabled中有突然终止标志,则不会调用它(我设置了“应用程序应获取应用程序死亡事件”,即使从多任务基座关闭应用程序,也没有调用终止

您好,我已经阅读了一些关于应用程序将终止被呼叫和不被呼叫的问题

我想总结一下我的理解,因为有几篇帖子的表达方式不同

  • 对于IOS(无多任务处理),当按下home(主页)按钮时,它总是被调用

  • 适用于IOS 4及以上版本

    a。当按下home(主页)按钮时(当应用程序移到后台时),它不会被调用

    b。从多任务驳接关闭应用程序时会调用它,如果应用程序在info.plist disabled中有突然终止标志,则不会调用它(我设置了“应用程序应获取应用程序死亡事件”,即使从多任务基座关闭应用程序,也没有调用终止功能)

  • 基于此,我有几个问题

    设置应用程序应获取应用程序死亡事件标志是否是一种好的做法?(我设置了“应用程序应获取应用程序死亡事件”,即使在从多任务基座关闭应用程序时,终止功能也没有被调用)

    注册“UIApplicationWillTerminateNotification”是否比info.plist设置更好

    基本上,我需要做一些工作,只有当应用程序终止,而不是当它移动到后台

    编辑(1): 当应用程序终止时,将向应用程序发送以下内容。我怎么抓住它

    程序收到信号:“SIGKILL”

    编辑(2):

    请注意:在IOS 4及更高版本中,从多任务基座中移除时,不会调用它。你可能认为是的。但就我而言,情况并非如此

    我在问是否有人知道原因?我还缺什么吗

    还请注意,我设置了“应用程序应获取应用程序死亡事件”,即使这样,它也不会被调用

    编辑(3):

    以下问题的答案也不起作用。


    有人面临与我类似的问题吗?

    简而言之,除非您的Info.plist中的
    UIApplicationExitsOnSuspend
    设置为YES,否则在iOS4及更高版本中,无法保证
    应用程序将终止:
    将被调用

    正如上面所说:

    对于支持后台执行的应用程序,此方法是 通常在用户退出应用程序时不调用,因为 在这种情况下,应用程序只需移动到后台。但是, 在应用程序正在运行的情况下,可以调用方法 后台(未挂起),系统需要终止它 出于某种原因

    (我的重点。)

    如果您需要在应用程序退出之前执行某些操作,则需要在
    applicationidenterdbackground:
    中执行。无法捕获SIGKILL。

    来源:

    我将状态保存代码从applicationWillTerminate复制到ApplicationIdentinterBackground,还添加了一个多任务布尔值,以便我只调用ApplicationIdentinterBackground中的状态保存。因为,多任务设备上有一个实例调用applicationWillTerminate:如果应用程序位于前台,并且您关闭了设备电源。在这种情况下,ApplicationIdentinterBackground和ApplicationTerminate都将被调用


    我看到
    -applicationWillTerminate:
    通过以下测试被调用。在新项目中(我使用了“单视图应用程序”模板),向AppDelegate添加以下内容:

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    
        __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            if (identifier != UIBackgroundTaskInvalid) {
                [[UIApplication sharedApplication] endBackgroundTask:identifier];
                identifier = UIBackgroundTaskInvalid;
            }
        }];
    
        dispatch_async(dispatch_get_main_queue(), ^{
            for (int i=0; i < 20; i++) {
                NSLog(@"%d", i);
                sleep(1);
            }
            if (identifier != UIBackgroundTaskInvalid) {
                [[UIApplication sharedApplication] endBackgroundTask:identifier];
                identifier = UIBackgroundTaskInvalid;
            }
        });
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    }
    
    -(无效)应用程序标识符背景:(UIApplication*)应用程序
    {
    NSLog(@“%s”,函数);
    __block UIBackgroundTaskIdentifier=[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:^{
    如果(标识符!=UIBackgroundTaskInvalid){
    [[UIApplication sharedApplication]endBackgroundTask:标识符];
    标识符=UIBackgroundTaskInvalid;
    }
    }];
    dispatch\u async(dispatch\u get\u main\u queue()^{
    对于(int i=0;i<20;i++){
    NSLog(@“%d”,i);
    睡眠(1);
    }
    如果(标识符!=UIBackgroundTaskInvalid){
    [[UIApplication sharedApplication]endBackgroundTask:标识符];
    标识符=UIBackgroundTaskInvalid;
    }
    });
    }
    -(无效)申请将终止:(UIApplication*)申请
    {
    NSLog(@“%s”,函数);
    }
    
    此示例将在应用程序进入后台时启动后台任务。该任务只是一个20秒的延迟(每秒记录一次),使应用程序在后台运行(注意后台运行和挂起之间的区别)足够长的时间,以允许从应用程序切换器中删除它

    因此,要测试它,运行应用程序,点击home按钮将应用程序发送到后台,然后在20秒延迟结束之前,从应用程序切换器中删除应用程序。20秒结束后,
    -application将终止:
    被调用。您可以在Xcode中查看控制台以验证情况是否如此


    我在iOS 5.1和6.1(都是iPhone)的iOS模拟器中尝试了这一点,并在这两种情况下都看到了这一点。我还在运行iOS 6.1.2的iPhone 4S上进行了测试,发现了相同的行为。

    据我所知,有3种情况下,您的应用程序会死机

  • 由最终用户终止,您可以在
    -[UIApplication applicationWillEnterBackground:
    中执行某些操作,在这种情况下,将不会调用
    -[UIApplication applicationWillTerminate:]

  • 被系统丢弃,如内存不足,您可以在
    -[UIApplication applicationWillTerminate://code>中执行操作,在这种情况下,我们不知道是否调用了
    applicationWillEnterBackground:

  • 崩溃了,除了使用某种崩溃报告工具,什么也做不了。(已编辑:无法捕获
    SIGKILL


  • 正如我们所知,当
    -应用程序将终止时,应用程序只有5秒时间[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];
    
        print("applicatoinWillTerminate")
    
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }