- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的一些用户遇到了这个崩溃(据他们说,它发生在使用应用程序 4-5 分钟后)但我自己无法重现:
Application Specific Information:
<BKNewProcess: 0x175466c0; com.zsquare.iPadApp; pid: 5005; hostpid: -1> has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x17545c90> id: 48-3A424578-FF1D-4484-9026-B4C6A83AD7EF name: Background Content Fetching (191) process: <BKNewProcess: 0x175466c0; .com.zsquare.ijournalPad; pid: 5005; hostpid: -1> permittedBackgroundDuration: 30.000000 reason: backgroundContentFetching owner pid:48 preventSuspend preventThrottleDownUI preventIdleSleep preventSuspendOnSleep
)}
Elapsed total CPU time (seconds): 0.460 (user 0.460, system 0.000), 2% CPU
Elapsed application CPU time (seconds): 0.013, 0% CPU
Filtered syslog: None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0:
0 libsystem_kernel.dylib 0x362a4ff0 mach_msg_trap + 20
1 libsystem_kernel.dylib 0x362a4df4 mach_msg + 38
2 CoreFoundation 0x23fa58c4 __CFRunLoopServiceMachPort + 134
3 CoreFoundation 0x23fa3c4c __CFRunLoopRun + 1034
4 CoreFoundation 0x23ef7118 CFRunLoopRunSpecific + 518
5 CoreFoundation 0x23ef6f04 CFRunLoopRunInMode + 106
6 GraphicsServices 0x2d081ac8 GSEventRunModal + 158
7 UIKit 0x28139f14 UIApplicationMain + 142
8 SimpleList-iPad 0x0000f116 main (main.m:17)
9 libdyld.dylib 0x361e9872 start + 0
现在我已经查看了处理此崩溃的各种其他 SO 问题,但没有一个答案对我有帮助,所以我想我应该在这里发布我自己的设置和代码。
首先,发生这种情况的功能与应在应用中运行的重复任务有关。为此,我在应用程序首次启动时在应用程序中重复了一个计时器:
- (void) setupRepeatTimer {
self.repeatTimer = [NSTimer scheduledTimerWithTimeInterval: 60.0 target:self selector:@selector(checkForAutomaticTaskTime:) userInfo:nil repeats: YES];
self.repeatTimer.tolerance = 1.0;
- (void) checkForAutomaticTaskTime: (NSTimer *) timer {
if (self.taskIdentifier) {
[[UIApplication sharedApplication] endBackgroundTask: self.taskIdentifier];
}
self.taskIdentifier = UIBackgroundTaskInvalid;
[self beginBackgroundUpdateTask];
// simplified, but there are more conditional checks here
if ([[UIApplication sharedApplication] applicationState] == UIApplicationStateActive && setting_enabled_for_automatic_task) {
[self startAutomaticBackup];
} else {
[self endBackgroundUpdateTask];
}
}
需要运行的备份大小可变,具体取决于用户的数据。这是一般代码:
- (void) startAutomaticBackup {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self runBackupWithCompletionBlock:^(NSString * filename) {
dispatch_async(dispatch_get_main_queue(), ^{
// finish on the main thread
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[self endBackgroundUpdateTask];
});
}];
});
}
可以肯定的是,beginBackgroundUpdateTask
和 endBackgroundUpdateTask
看起来与 SO 和 Apple 指南中的代码示例完全一样:
- (void) beginBackgroundUpdateTask
{
self.taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"CJAutoBackup" expirationHandler:^{
NSLog(@"beginBackgroundTask about to end = %lu", (unsigned long)self.taskIdentifier);
[self endBackgroundUpdateTask];
}];
}
- (void) endBackgroundUpdateTask
{
if (self.taskIdentifier) {
[[UIApplication sharedApplication] endBackgroundTask: self.taskIdentifier];
self.taskIdentifier = UIBackgroundTaskInvalid;
}
}
====
这就是我的设置。从用户描述来看,在应用程序运行 4-5 分钟后,应用程序似乎在前台崩溃并显示此崩溃报告。如果他们禁用自动备份设置,该应用程序将再次正常运行。
这里主要的混淆是当应用程序在前台而不是后台使用它时应用程序崩溃,但错误消息谈论后台任务断言。这怎么可能?
另外,我可以做些什么来防止这个问题?我已经看到提到的 UIApplication 的 backgroundTimeRemaining
属性,但我不确定在我的示例中如何或在何处使用它。
使用 NSTimer 会导致任何并发症吗?在设备上,如果应用程序已经在后台,它似乎不会触发计时器。
感谢帮助。
最佳答案
这是一个线程问题。正如您所怀疑的那样,问题确实是开始/结束后台任务调用的分解和架构。您试图将一个后台任务标识符作为属性维护,然后您每 60 秒重复更改一次,而不管实际任务需要多长时间(在后台线程上).这种令人困惑的伪循环架构会导致您的后台任务与其标识符不同步,因此后台任务的时间会在您没有使用适当的标识符调用 endBackgroundTask
时到期。
您需要修改此体系结构,以便每个任务 有一个后台任务标识符,从而使所有内容分开。我认为您会发现最简单的方法是将每个自动备份表示为单独的 NSOperation。
关于iOS 应用程序 "has active assertions beyond permitted time - occasional crashes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33580697/
我是 Arduino 世界的新手。编写了以下代码 - 使用 DHT22 传感器。 12 小时后,当温度低于所需温度时,我的温室的加热器没有打开。 关闭电源并重新打开后,一切恢复正常。我知道这段代码很乱
我正在使用 CENTOS6 和 REDHAWK2.0 (RH2.0)。基于“VirtualBox 5.0.16 for Windows host”和“VirtualBox 5.0.17 r106140
在无渲染模式下使用 VMR-9 时如何解决 SelectAtPosition() 崩溃? 最佳答案 使用无渲染模式时的 SelectAtPosition() 崩溃问题可以通过在自定义分配器中实现 IV
这是我从 logcat 复制的错误。我不知道为什么在应用设置屏幕中清除数据后应用程序崩溃。 02-20 17:22:29.980 839-1094/? I/InputReader: Apps
我收到了来自 Apple 的应用提交反馈: Thank you for your resubmission. We were unable to review your app as it crash
我有一个 iPad 应用程序。使用 Fabric 收集崩溃信息。最近出现了一些像 webthread EXC_BREAKPOINT 这样的崩溃。跟踪堆栈上没有我的代码。所以我不知道为什么会发生崩溃。
我有一个在 ubuntu(EC2 实例,t2.small)上运行的简单 python web-scraper,到目前为止它只打印出一个 url 列表: from bs4 import Beautifu
注意:我的问题之前已关闭,我尝试了此处提到的解决方案 - unknown error: session deleted because of page crash from unknown error
我正在尝试从一个场景过渡到另一个场景,但是当我调用 presentScene 时发生崩溃!场景未存储在类中或被引用,它们直接加载到 presentScene 调用中。 Xcode 崩溃截图: 我的简单
我有点困惑,我的应用程序几乎没有崩溃,崩溃日志也有以下信息。 崩溃:com.twitter.crashlytics.ios.exception 这是否意味着它是 Fabric 库的崩溃还是有效的崩溃?
我尝试在我的 ubuntu 16.04 远程服务器上使用 selenium webdriver 和 python 3.5.2 连接到网页 from pyvirtualdisplay import Di
我正在使用使用 Python 和 Selenium 的 InstaPy。我按 Cron 启动脚本,有时它会崩溃。所以它真的很不规则,有时它会很好地贯穿始终。我也已经在 GitHub Repo 上发帖,
最近我换了电脑,从那以后我无法使用 selenium 启动 chrome。我也尝试过 Firefox,但浏览器实例无法启动。 from selenium import webdriver d = we
我正在使用 InstaPy,它使用 Python 和 Selenium。我按照 Cron 启动脚本,但有时它会崩溃。所以它确实不规则,有时它贯穿得很好。我已经在 GitHub Repo 上发布了,但没
我正在使用 InstaPy,它使用 Python 和 Selenium。我按照 Cron 启动脚本,但有时它会崩溃。所以它确实不规则,有时它贯穿得很好。我已经在 GitHub Repo 上发布了,但没
我正在使用使用 Python 和 Selenium 的 InstaPy。我按 Cron 启动脚本,有时它会崩溃。所以它真的很不规则,有时它会很好地贯穿始终。我也已经在 GitHub Repo 上发帖,
我正在尝试使用rook在kubernetes集群上配置ceph,我已经运行了以下命令: kubectl apply -f common.yaml kubectl apply -f operator.y
我有一个屏幕A,在执行了一些POST API任务后,我启用了一个按钮,然后单击按钮导航到屏幕B。当Reaction Native应用程序冻结并崩溃时,崩溃会随机发生。从其他屏幕导航到屏幕B也不是问题,
我想知道操作系统是否可能导致崩溃,例如我是否有代码,它是否有可能在Windows环境下崩溃而在Linux上却没有崩溃?还是这不可能? 最佳答案 最简单的示例是代码,您的意图是使其与平台兼容,但是您的代
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我是一名优秀的程序员,十分优秀!