我升级了 watchOS 应用程序以支持新的 watchOS 3 后台模式。大多数时候工作得很好。但更常见的是,我喜欢它被 watchOS 杀死,报告如下:
Incident Identifier: XXX
CrashReporter Key: xxxx
Hardware Model: Watch1,1
Process: AppName App Extension [271]
Identifier: com.example.app.appextension
Version: 171 (1.13)
Code Type: ARM (Native)
Role: Foreground
Parent Process: launchd [1]
Coalition: <none> [0]
Date/Time: 2016-09-16 11:09:47.5463 +0200
Launch Time: 2016-09-16 11:05:19.6587 +0200
OS Version: Watch OS 3.0 (14S326)
Report Version: 104
Exception Type: 00000020
Exception Codes: 0x000000008badf00d
Exception Note: SIMULATED (this is NOT a crash)
Highlighted by Thread: 0
Application Specific Information:
<BKNewProcess: 0x14540580; com.example.app.appextension; pid: 271; hostpid: 104> has active assertions beyond permitted time:
{(
<BKProcessAssertion: 0x14550e20> id: 104-85D4A371-50C7-46D1-8674-8F664FB17511 name: CUP-DCE601C5-C370-4098-AAD5-76CB68EA95E3-com.example.app.appextension process: <BKNewProcess: 0x14540580; com.example.app.appextension; pid: 271; hostpid: 104> permittedBackgroundDuration: 30.000000 reason: complicationUpdate owner pid:104 preventSuspend preventThrottleDownCPU preventIdleSleep wantsForegroundResourcePriority preventSuspendOnSleep
)}
Elapsed total CPU time (seconds): 2.040 (user 2.040, system 0.000), 7% CPU
Elapsed application CPU time (seconds): 0.002, 0% CPU
它经常发生在大约。我最后一个命令运行后 30 秒(根据我的日志),但有时也更早,但几乎总是在我的任务完成之后。我也确实正确地完成了任务task.setTaskCompleted()
(或者至少我是这么认为的)。
似乎有些东西阻止了应用程序被报告为“我完成了”,但我不知道是什么。有人知道它可能是什么吗?我很乐意提供更多信息,但我不知道从哪里开始,因为这个问题并不是真正可重现的。只是这种情况发生得太频繁了。
如果它很重要,我会使用带有后台会话的 NSURLDownloadSessionTask 来下载数据,但这似乎在大多数情况下都能正常运行并完成(当然,网络错误除外,但这与应用程序的终止没有关联)
编辑:
经过大量调试,我似乎知道更多,但仍然没有结论
发生的情况是,当我的应用程序变为活动状态时,它会通过 NSURLDownloadSessionTask 后台会话请求新数据。它还询问当前位置。所有这些都可能需要相当长的时间(总共最多 20 秒)。所以,当我现在离开应用程序时,这些任务可能仍然在后台运行。似乎也可以正常工作,因为我可以使用的后台时间约为。30秒。
但是当我在这些任务完成之前关闭应用程序,然后 WKSnapshotRefreshBackgroundTask 进入,我等到任务完成并发送 .setTaskCompleted()。但在这种情况下,该应用程序似乎永远不会自行暂停。在这种情况下,ViewController 的 willDisappear 和 didDeactivate 都不会被调用,并且应用程序会在 30 秒后被上述报告杀死。
当一个常规的 WKSnapshotRefreshBackgroundTask 在没有运行的情况下进入时,一切正常,并且只要我调用 .setTaskCompleted 就会执行 willDisappear
我不知道,为什么在第一种情况下 willDisappear 没有被调用。看起来该应用程序正在等待完成某些事情,但是什么也没有,afaik。而且我也不用这些任务更新界面,只是更新模型。