Подтвердить что ты не робот

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 приложение разбилось.

Итак, мы обнаружили крах, но мы не знаем, что происходит. Любой сталкивался с этой проблемой или имел представление, что это может быть?

Спасибо

4b9b3361

Ответ 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 и выгрузите стек, который вызвал нечисловое значение.