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

Posted

技术标签:

【中文标题】10分钟后锁定和解锁屏幕时发生的崩溃如何解决?【英文标题】:How to fix crash thats happens when I lock and unlock the screen after 10mins? 【发布时间】:2013-10-11 10:18:53 【问题描述】:

在 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 分钟,它就会崩溃。根据我的理解,我不应该让任务在后台连续运行,我应该为每个任务设置一些时间间隔。但我不知道如何设置杀死他们的时间间隔。

请建议我一些步骤来解决这个问题。

【问题讨论】:

实际上不能将过期时间设置为一些离散值。它由 ios 管理。 IOS 将在到期后自行停止您的后台任务。如果我是对的,那是 iOS7 前 10 分钟,iOS7 前 3 分钟。而且您永远不应该尝试手动杀死您的应用程序。你的应用程序是如何崩溃的?你的意思是它会重新启动?请参阅此处了解更多信息:***.com/questions/18247808/… 我启动应用程序并单击主页按钮,当我尝试在 10 分钟后重新启动应用程序时,它会从第一个屏幕开始 在 NSURLRequest 中设置请求的超时时间。假设它不是一个足够大的文件。如果您需要长时间下载,请查看 iOS 7 中的后台传输。添加到后台会话的任务在外部进程中运行,即使您的应用被挂起、崩溃或被终止,也会继续运行。 我也添加了。 80 秒。 【参考方案1】:

这里有几个重要的点,其中很多已经在 cmets 中介绍过。

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

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

您可以从崩溃报告中验证这一点,该报告将显示“有超出允许时间的活动断言”

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

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

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

下一个可能不是真正的后台执行问题是您并没有真正崩溃。在与 Xcode 断开连接的情况下运行您的应用程序,看看它是否会生成崩溃报告。如果没有,您可能只是由于内存压力而被弹出。如果这真的是一个太长的后台问题,你会看到异常代码是 0x0badfood。糟糕的食物会让看门狗定时器生气。

我认为,当后台进程被悄悄弹出时,它们曾经从后台应用程序中删除,但现在操作系统会用屏幕截图替换它们,并在用户将它们带到前台时重新启动它们。

【讨论】:

以上是关于10分钟后锁定和解锁屏幕时发生的崩溃如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置资源锁定的到期时间?

在析构函数中锁定和解锁关键部分以避免崩溃是正确的方法吗?

如何从服务中可靠地捕获 Windows 登录、注销、锁定和解锁事件?

共享内存锁定和进程崩溃

【pam_tally2】使用pam_tally2锁定和解锁SSH失败的登录尝试

拆分 MS Access 数据库需要很长时间才能打开 - 后端不断锁定和解锁