2017-07-18 4 views
17

Mes applications ont un accident important -WKWebView se bloque si l'utilisateur répond à un iMessage entrant

CALayer position contains NaN: [377.833 nan] 

avec la pile suivante -

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 

En regardant les journaux des utilisateurs que j'ai trouvé quelques choses communes -

  1. Tous les utilisateurs sont dans un contrôleur de vue qui contient une WKWebView
  2. Tous les journaux indiquer que l'application a « applicationWillResignActive » avant le crash
  3. La pile montre qu'un clavier a été ouvert, mais nous ne pas loin d'ouvrir le clavier que View Controller
  4. tous les utilisateurs sont iOS 10.3 +

Le seul scénario qui convenait était qu'un utilisateur recevait un iMessage alors que l'application était avec un WKWebView visible et le forçait à répondre rapidement. Nous avons testé ce scénario et BOOOM l'application s'est écrasée.

Nous avons donc trouvé le crash, mais nous n'avons aucune idée de ce qui se passe. Quelqu'un a fait face à ce problème ou a une idée de ce que cela pourrait être?

Merci

+1

Pouvez-vous reproduire ce problème avec un projet créé à partir de rien (donc une configuration minimale + WKWebView)? – idmean

+0

Je seconde la motion de reproduire avec un projet distinct. Pendant ce temps, dans votre projet actuel qui plante, définissez un point d'arrêt symbolique sur '[CALayer setPosition:]' et imprimez la position en cours en faisant 'po NSStringFromCGPoint (position)'. Définissez également un point d'arrêt symbolique sur '[UIView setFrame:]' juste avant que cela n'arrive. Encore une fois, imprimez le cadre. Voyez ce qui est en train d'être défini. Voyez si le cadre de votre webview est valide ou non. Vérifiez vos contraintes, etc. – Brandon

+0

Essayé et joué avec scénario que vous avez mentionné, mais n'a pas pu produire un accident. Semble quelque chose d'autre est cassé. –

Répondre

2

Vous ne savez pas si cela vous aide. J'ai également fait face au problème de NAN et cela arrive si n'importe quelle valeur est corrompue ou invalide. Donc, si vous pouvez savoir où votre valeur est corrompue signifie qu'il est en train d'imprimer NAN puis sur ce que vous pouvez mettre l'instruction de garde.

2

(1) d'abord vérifier votre mise en page est correcte, utilisez « Autolayout » et assurez-vous que vos contraintes sont correctes et que vous mettez les sous-vues correctes. Essayez de déboguer visuellement la mise en page pour voir si des choses étranges se produisent.

Déboguer-> Afficher le débogage-> Afficher la hiérarchie. A partir de la trace de la pile, je remarque que le clavier est présenté, et pour cette raison, les vues doivent être ajustées pour faire place au clavier. Il est à noter que cela se produit dès qu'un message arrive dans la trace de la pile.

Je tenterais aussi resignFirstResponder, peut-être dans votre AppDelegate

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

(3) J'ai aussi trouvé qu'il ya un bug, où le WKWEbView ne resignFirstResponder .. cela pourrait être lié:

Bug 167898 - [iOS] - [WKWebView becomeFirstResponder] et - [WKWebView resignFirstResponder] ne pas appelée lors de la première modification de répondeur non programmatiques se produisent

Peut-être un solution de contournement serait alors de présenter une autre vue dès que votre demande démissionnera.

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

définir la CG_NUMERICS_SHOW_BACKTRACE variable environnementale dans le système d'exécution Xcode et il va vider la stacktrace qui a causé la valeur non numérique se produire.