Приложение iOS 11 WKWebView получает SIGKILL от Watchdog во время воспроизведения аудио

У меня есть приложение, которое загружает его содержимое через WKWebView. Этот WebView иногда имеет <audio>-Контент, который пользователь может играть. Предполагается, что этот аудиоконтент продолжает воспроизводиться, пока приложение находится в фоновом режиме или устройство заблокировано. Пока все хорошо, это хорошо работает на iOS <= 10, но с iOS11 приложение убито сторожевым таймером.

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace <0xF>, Code 0x8badf00d
Triggered by Thread:  0

Filtered syslog:
None found

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x0000000183f45150 __psynch_cvwait + 8
1   libsystem_pthread.dylib         0x000000018405efc0 _pthread_cond_wait$VARIANT$armv81 + 624
2   JavaScriptCore                  0x000000018ad690ac WTF::ThreadCondition::timedWait+ 53420 (WTF::Mutex&, double) + 148
3   JavaScriptCore                  0x000000018b676a1c WTF::BinarySemaphore::wait+ 9546268 (WTF::TimeWithDynamicClockType) + 88
4   WebKit                          0x00000001934d3d2c IPC::Connection::waitForSyncReply+ 208172 (unsigned long long, WTF::Seconds, WTF::OptionSet<IPC::SendSyncOption>) + 276
5   WebKit                          0x00000001934d3524 IPC::Connection::sendSyncMessage+ 206116 (unsigned long long, std::__1::unique_ptr<IPC::Encoder, std::__1::default_delete<IPC::Encoder> >, WTF::Seconds, WTF::OptionSet<IPC::SendSyncOption>) + 348
6   WebKit                          0x00000001936f5f78 bool IPC::Connection::sendSync<Messages::WebProcess::ProcessWillSuspendImminently>+ 2445176 (Messages::WebProcess::ProcessWillSuspendImminently&&, Messages::WebProcess::ProcessWillSuspendImminently::Reply&&, unsigned long long, WTF::Seconds, WTF::OptionSet<IPC::SendSyncOption>) + 144
7   WebKit                          0x00000001936f0d74 bool WebKit::ChildProcessProxy::sendSync<Messages::WebProcess::ProcessWillSuspendImminently>+ 2424180 (Messages::WebProcess::ProcessWillSuspendImminently&&, Messages::WebProcess::ProcessWillSuspendImminently::Reply&&, unsigned long long, WTF::Seconds, WTF::OptionSet<IPC::SendSyncOption>) + 120
8   WebKit                          0x00000001936f0cec WebKit::WebProcessProxy::sendProcessWillSuspendImminently+ 2424044 () + 76
9   WebKit                          0x0000000193582164 -[WKProcessAssertionBackgroundTaskManager _notifyClientsOfImminentSuspension] + 228
10  WebKit                          0x000000019358246c __64-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]_block_invoke + 172
11  UIKit                           0x000000018dacad14 -[UIApplication workspaceNoteAssertionExpirationImminent:] + 284
12  libdispatch.dylib               0x0000000183db1048 _dispatch_client_callout + 16
13  libdispatch.dylib               0x0000000183decb10 _dispatch_block_invoke_direct$VARIANT$armv81 + 280
14  FrontBoardServices              0x0000000186b0d9f4 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36
15  FrontBoardServices              0x0000000186b0d698 -[FBSSerialQueue _performNext] + 404
16  FrontBoardServices              0x0000000186b0dc34 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
17  CoreFoundation                  0x00000001843d62e8 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
18  CoreFoundation                  0x00000001843d6268 __CFRunLoopDoSource0 + 88
19  CoreFoundation                  0x00000001843d5af0 __CFRunLoopDoSources0 + 204
20  CoreFoundation                  0x00000001843d36c8 __CFRunLoopRun + 1048
21  CoreFoundation                  0x00000001842f3fb8 CFRunLoopRunSpecific + 436
22  GraphicsServices                0x000000018618bf84 GSEventRunModal + 100
23  UIKit                           0x000000018d8c82e8 UIApplicationMain + 208
24  My.App.bundle           0x000000010286c43c main + 492604 (main.m:14)
25  libdyld.dylib                   0x0000000183e1656c start + 4

...

Журнал аварий не дает никаких указаний на мой код. У кого-нибудь есть идея, что заставляет сторожевой таймер убить мое приложение на iOS11?

Недавно я создал тестовое приложение с WKWebView, которое просто содержит статический HTML-файл с аудио-тегом. Это НЕ убито сторожевым псом.

Я также признал, что тестовое приложение показывает надлежащие элементы управления мультимедиа с текущим индикатором времени, в то время как приложение "live" замораживает элементы управления мультимедиа и не дает обновления индикатора времени. Я думаю, что это указывает на некоторую задержку / блокировку основного потока..!?

1 ответ

Я провел исследование, которое заняло у меня около одного дня, в конце концов я обнаружил, что ничего не было с WkWebview и аудио тегом IN MY CASE.

Это вызвано фоновой задачей, которая не была завершена. Поэтому ищите ваш код с помощью "beginBackgroundTaskWithExpirationHandler", а также "beginBackgroundTaskWithName:", убедитесь, что каждая фоновая задача завершена правильно.

Перед созданием новой фоновой задачи не забудьте завершить старую и назначить новую переменной-члену.

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