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

0 ответов

Другие вопросы по тегам