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