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 登录、注销、锁定和解锁事件?