如何修复10分钟后锁定和解锁屏幕时发生的崩溃?

时间:2013-10-11 10:18:53

标签: iphone ios ipad cocoa-touch nsurlconnection

我在ping服务器之前使用以下代码为我的应用添加了后台进程支持:

UIApplication *app = [UIApplication sharedApplication];
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        }];
        if (!connection) {
            connection = [[NSURLConnection alloc] init];
        }
        (void)[connection initWithRequest:originalRequest delegate:self];

由于此代码,如果我将应用程序保持在后台模式超过10分钟,则会崩溃。根据我的理解,我不应该允许任务在后台连续运行,我应该为每个任务设置一些时间间隔。但我不知道如何设置杀死它们的时间间隔。

请建议我解决此问题的一些步骤。

1 个答案:

答案 0 :(得分:1)

这里有几个要点,其中许多内容已在评论中介绍过。

首先,你所拥有的时间尚不清楚。有经验值(iOS 7之前10分钟,iOS 7为3分钟),但这些都不能保证。特别是,如果您从睡眠中醒来工作(例如地理位置警报),您可能无法获得全职工作,您可能只能从上次获得剩余时间。您可以采取特定的操作来重置时间(例如,使用GPS获取您的位置可能会在某些版本的iOS中重置计时器。)

其次,你没有被杀,因为你还在做工作,你被杀了,因为你告诉操作系统你还在做工作。操作系统不关心您的网络传输,它关心您的beginBackgroundTaskWithExpirationHandler。

您可以从崩溃报告中验证这一点,该报告会说“有超出允许时间的有效断言”

这有三个可能的原因 1)操作系统称为完成处理程序,但您没有及时调用endBackgroundTask。调用后台处理程序时你没有太多时间,但我怀疑这是问题,你的代码非常紧凑。

2)操作系统调用了你的完成处理程序,但你根本没有调用endBackgroundTask。我继承了执行此操作的代码,正常的原因是代码不是可重入的,并且它被调用两次。 bgtask更新为第二个值,因此当完成处理程序触发时,bgtask对于一个任务结束两次而从不对另一个任务结束。同样,我认为你是安全的,这通常是成员变量的问题,在你的情况下,bgtask应该被块复制。

3)操作系统没有调用你的后台处理程序(不太可能,但我对iOS 7有一些毫无根据的怀疑)。

下一个不是真正的后台执行问题的可能性是你并没有真正崩溃。运行与Xcode断开连接的应用程序,看它是否生成崩溃报告。如果没有,你可能只是因为记忆压力而被驱逐出境。如果这在背景问题中真的太长了,你会看到异常代码是0x0badfood。糟糕的食物让看门狗定时器生气。

我认为后台应用程序在安静地弹出后会被删除,但现在操作系统会用屏幕截图替换它们,如果用户将它们带到前台,则重新启动它们。