ios - 当应用程序进入后台和 iPad 自动锁定时应用程序崩溃

标签 ios objective-c background

当我的应用程序进入后台模式并且 iPad 被锁定时,我的应用程序面临一个奇怪的问题。到那时它工作正常,但是当我解锁设备并从后台打开应用程序时,它崩溃了。

这是崩溃日志,我从设备获取

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Exception Note:  SIMULATED (this is NOT a crash)
Highlighted by Thread:  8

Application Specific Information:
<BKNewProcess: 0x12cd18cb0; com.apps-factory; pid: 540; hostpid: -1> has active assertions beyond permitted time: 
{(
    <BKProcessAssertion: 0x12cd1e3b0> id: 540-72C6AF6C-F674-40E8-BA89-EFE4BF52F8D6 name: Called by UIKit, from <redacted> process: <BKNewProcess: 0x12cd18cb0; com.apps-factory; pid: 540; hostpid: -1> permittedBackgroundDuration: 180.000000 reason: finishTask owner pid:540 preventSuspend  preventIdleSleep  preventSuspendOnSleep 
)}

Elapsed total CPU time (seconds): 82.430 (user 82.430, system 0.000), 23% CPU 
Elapsed application CPU time (seconds): 77.475, 21% CPU

Filtered syslog:
None found

我的应用程序在屏幕上具有连续的点动画,例如基于与服务器同步的数据库中的数据的降雨效果。

任何帮助将不胜感激。
提前致谢!!

最佳答案

看着你的 crash log我确信您崩溃的原因是由于 3 mins (180 seconds) 之后仍在进行后台提取。 .

所以如果我在 3 分钟后没有错,它会杀死你的应用程序,当你重新打开它时,它已经处于崩溃模式,所以它不会直接运行。

我在我的应用程序中遇到了同样的问题,所以要解决这个问题,我必须开始 background task在我的代码中通过AppDelegate像这样:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];

然后我们需要在 Application 委托(delegate)方法中结束该任务
- (void)applicationDidEnterBackground:(UIApplication *)application {

    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
        //Save your state or data while invalidating bgTask.

        }];
}

这就是为什么在你的崩溃报告中苹果明确提到操作系统只允许在后台执行任何任务 3 分钟!

检查您的崩溃:
Application Specific Information:
    <BKNewProcess: 0x12cd18cb0; com.apps-factory; pid: 540; hostpid: -1> has active assertions beyond permitted time: 
    {(
        <BKProcessAssertion: 0x12cd1e3b0> id: 540-72C6AF6C-F674-40E8-BA89-EFE4BF52F8D6 name: Called by UIKit, from <redacted> process:  <BKNewProcess: 0x12cd18cb0; com.apps-factory; pid: 540; hostpid: -1>  permittedBackgroundDuration: 180.000000  reason: finishTask owner  pid:540 preventSuspend  preventIdleSleep  preventSuspendOnSleep 
    )}

permittedBackgroundDuration: 180.000000 reason: finishTask owner



意味着我们只有 180 秒的时间在后台执行任何任务,如 apple documentation 中所述.

如果您仍然需要更多时间来执行您的任务,那么您需要启用您的 app background mode有特定原因,否则苹果可能会拒绝您的应用。

希望这将有助于解决您的崩溃问题。

关于ios - 当应用程序进入后台和 iPad 自动锁定时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38830179/

相关文章:

ios - 是否可以在非 View 类中创建 IBOutlet?

ios - 使用并行作用域中的 block 中的变量

iOS 9 如何检测静音模式?

ios - UIViewController 自定义转换和状态恢复

sockets - flutter : keep socket io open while app in background (IOS)

android - Flutter Web 在现有 Flutter 应用程序中创建问题

ios - UITableView 不填充数据

css 图片

objective-c - 为什么这个从 NSData 对象创建的 NSString 无法显示它有内容?

html - CSS:背景在移动设备上不拉伸(stretch)