Приложение watchOS 3, кажется, случайно убито в фоновом режиме
Я обновил свое приложение 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 не называется. Похоже, что приложение ждет, когда что-то будет завершено, но ничего, афаик. И я также не обновляю интерфейс этими задачами, просто обновляю модель.