2017-07-18 92 views
17

Moje aplikacje mają znaczący crash -WKWebView wywala jeśli użytkownik odbiera przychodzące iMessage

CALayer position contains NaN: [377.833 nan] 

z następującym Stack -

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 

patrząc na logi użytkowników znalazłem kilka wspólnych rzeczy -

  1. wszyscy użytkownicy są w kontroler widoku, który zawiera WKWebView
  2. Wszystkie dzienniki wskazują, że aplikacja dostał „applicationWillResignActive” przed katastrofą
  3. Stos pokazuje, że klawiatura została otwarta, ale nie mamy z dala, aby otworzyć klawiaturę na tej View Controller
  4. wszyscy użytkownicy iOS 10,3 +

Jedynym scenariuszem, który pasował, było to, że użytkownik otrzymał wiadomość iMessage, gdy aplikacja była z widocznym WKWebView i wymusiła na szybkiej odpowiedzi. Przetestowaliśmy ten scenariusz i BOOOM, gdy aplikacja się zawiesiła.

Znaleźliśmy awarię, ale nie mamy pojęcia, co się dzieje. Ktoś stawiła czoła temu problemowi lub ma pojęcie, co to może być?

Dzięki

+1

Czy możesz odtworzyć ten problem za pomocą projektu zbudowanego od podstaw (tak więc wystarczy minimalna konfiguracja + WKWebView)? – idmean

+0

Ja drugi wniosek do odtworzenia z oddzielnym projektem. W międzyczasie, w bieżącym projekcie, który faktycznie się zawiesza, ustaw symboliczny punkt przerwania na '[CALayer setPosition:]' i wydrukuj pozycję ustawianą przez wykonanie 'po NSStringFromCGPoint (position)'. Ustaw także symboliczny punkt przerwania na '[UIView setFrame:]' tuż przed tym zdarzeniem. Ponownie wydrukuj ramkę. Zobacz, co jest ustawione. Sprawdź, czy ramka Twojej przeglądarki jest prawidłowa, czy nie. Sprawdź swoje ograniczenia, itp. – Brandon

+0

Próbowałem i grałem ze scenariuszem, o którym wspomniałeś, ale nie mogłeś spowodować awarii. Wygląda na to, że coś innego jest zepsute. –

Odpowiedz

2

Nie jestem pewien, czy to ci pomaga. Miałem również do czynienia z problemem NAN i dzieje się tak, gdy jakakolwiek wartość jest uszkodzona lub nieprawidłowa. Jeśli więc dowiesz się, gdzie twoja wartość ulega korupcji, oznacza to, że drukujesz NAN, a następnie możesz umieścić oświadczenie strażnika.

2

(1) Najpierw dokładnie sprawdzić czy układ jest poprawny, użyj „autoLayout” i upewnij się, że ograniczenia są poprawne i jesteś ustawienie subviews poprawne.

Spróbuj wizualnie debugować układ, aby zobaczyć, czy zdarzają się dziwne rzeczy.

Debuguj-> Wyświetl debugowanie-> Hierarchia widoków przechwytywania.

(2) Ze śladu stosu zauważam, że klawiatura jest prezentowana i dlatego należy dostosować widoki, aby zrobić miejsce na klawiaturę. Jest to zauważalne, gdy tylko pojawi się komunikat w śladzie stosu.

Chciałbym również próbować resignFirstResponder, może w swojej AppDelegate

- (void)applicationWillResignActive:(UIApplication *)application { 
    [_wkWebView resignFirstResponder]; 
} 

(3) Odkryłem także, że nie jest to błąd, gdzie nie resignFirstResponder .. może to być związane WKWEbView:

Bug 167898 - [iOS] - [WKWebView becomeFirstResponder] i - [WKWebView resignFirstResponder] nie uzyskać wywołana, gdy zakaz zmiany programowe pierwszy responder zdarzyć

Może Obejście problemu polegałoby na przedstawieniu innego poglądu, gdy tylko Twoja aplikacja zostanie wycofana.

- (void)applicationWillResignActive:(UIApplication *)application { 
    // if _wkWebView is showing then hide and show other view 
} 
0

ustawić CG_NUMERICS_SHOW_BACKTRACE zmienną środowiskową w systemie run Xcode i będzie zrzucić StackTrace który spowodował wartość liczbowa nie występuje.