我升级了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都被调用,并且应用程序在30秒后被上述报告杀死。
当只有一个普通的WKSnapshotRefreshBackgroundTask进入而没有任何东西在运行时,一切正常,并且我会在调用时立即执行willDisappear .setTaskCompleted
我不知道,为什么在第一种情况下willDisappear不会被调用。看起来应用程序正在等待完成某些事情,但没有什么,afaik。而且我也不会使用这些任务更新界面,只需更新模型即可。