1

我升级了 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。而且我也不用这些任务更新界面,只是更新模型。

4

0 回答 0