WKWebView падает, если пользователь отвечает на входящий iMessage
Мои приложения имеют значительный сбой -
CALayer position contains NaN: [377.833 nan]
со следующим стеком -
Fatal Exception: CALayerInvalidGeometry
0 CoreFoundation 0x18283afe0 __exceptionPreprocess
1 libobjc.A.dylib 0x18129c538 objc_exception_throw
2 CoreFoundation 0x18283af28 -[NSException initWithCoder:]
3 QuartzCore 0x185b50acc CA::Layer::set_position(CA::Vec2<double> const&, bool)
4 QuartzCore 0x185b50c48 -[CALayer setPosition:]
5 QuartzCore 0x185b51198 -[CALayer setFrame:]
6 UIKit 0x1889657a8 -[UIView(Geometry) setFrame:]
7 UIKit 0x188979364 -[UIImageView _setViewGeometry:forMetric:]
8 UIKit 0x1889c6c38 -[UIScrollView _adjustScrollerIndicators:alwaysShowingThem:]
9 UIKit 0x188abfb34 -[UIScrollView(UIScrollViewInternal) _adjustForAutomaticKeyboardInfo:animated:lastAdjustment:]
10 WebKit 0x18c14af3c -[WKWebView _keyboardChangedWithInfo:adjustScrollView:]
11 CoreFoundation 0x1827d55f4 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__
12 CoreFoundation 0x1827d4d08 _CFXRegistrationPost
13 CoreFoundation 0x1827d4a84 ___CFXNotificationPost_block_invoke
14 CoreFoundation 0x1828437a8 -[_CFXNotificationRegistrar find:object:observer:enumerator:]
15 CoreFoundation 0x18271895c _CFXNotificationPost
16 Foundation 0x18322a930 -[NSNotificationCenter postNotificationName:object:userInfo:]
17 UIKit 0x1893500e4 -[UIInputWindowController postStartNotifications:withInfo:]
18 UIKit 0x189352350 __77-[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:]_block_invoke.907
19 UIKit 0x188a383cc -[UIInputViewAnimationStyle launchAnimation:afterStarted:completion:forHost:fromCurrentPosition:]
20 UIKit 0x189351dc8 -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:]
21 UIKit 0x1893588b0 -[UIInputWindowController setInputViewSet:]
22 UIKit 0x189351494 -[UIInputWindowController performOperations:withAnimationStyle:]
23 UIKit 0x188a30d94 -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:]
24 UIKit 0x1890f7160 -[_UIRemoteKeyboards keyboardChanged:shouldConsiderSnapshottingKeyboard:isLocalEvent:]
25 UIKit 0x1890f6e8c __37-[_UIRemoteKeyboards
Глядя на журналы пользователей, я нашел несколько общих вещей -
- Все пользователи находятся в контроллере представления, содержащем WKWebView
- Все журналы указывают, что приложение получило "applicationWillResignActive" перед сбоем
- Стек показывает, что клавиатура была открыта, но нам не нужно открывать клавиатуру на этом контроллере просмотра
- все пользователи iOS 10.3 +
Единственный сценарий, который подходит, - это то, что пользователь получил iMessage, в то время как приложение было с видимым WKWebView, и сила коснулась его быстрым ответом. Мы протестировали этот сценарий, и BOOOM приложение разбилось.
Итак, мы обнаружили крах, но мы не знаем, что происходит.
Любой сталкивался с этой проблемой или имел представление, что это может быть?
Спасибо
Ответы
Ответ 1
Не уверен, что это вам поможет. Я также столкнулся с проблемой NAN, и это происходит, если какое-либо значение повреждено или недействительно. Поэтому, если вы можете узнать, где ваше значение становится поврежденным, значит, оно печатает NAN, а затем вы можете поместить инструкцию guard.
Ответ 2
(1). Сначала дважды проверьте правильность вашего макета, используйте "Autolayout" и убедитесь, что ваш
ограничения правильны, и вы правильно настроили subviews.
Попробуйте визуально отладить макет, чтобы увидеть, происходят ли какие-либо странные вещи.
Отладка- > Просмотр отладки- > Иерархия просмотра.
(2) Из трассировки стека я замечаю, что клавиатура представлена, и из-за этого виды нужно отрегулировать, чтобы расположить клавиатуру. Заметно, что это происходит, как только сообщение приходит в трассировку стека.
Я также попытался бы resignFirstResponder, возможно, в вашем AppDelegate
- (void)applicationWillResignActive:(UIApplication *)application {
[_wkWebView resignFirstResponder];
}
(3) Я также обнаружил, что есть ошибка, где WKWEbView не будет resignFirstResponder.. это может быть связано:
Ошибка 167898 - [iOS] - [WKWebView становится первым пользователем] и - [WKWebView resignFirstResponder] не вызывается, когда происходят непрофессиональные изменения первого ответчика
Возможно, обходным путем будет представление другого представления, как только ваш
приложение уйдет в отставку.
- (void)applicationWillResignActive:(UIApplication *)application {
// if _wkWebView is showing then hide and show other view
}
Ответ 3
установите переменную окружения CG_NUMERICS_SHOW_BACKTRACE в схеме запуска Xcode и выгрузите стек, который вызвал нечисловое значение.