WKWebView在用户回答来电信息时崩溃

17

我的应用程序存在严重的崩溃 -

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

查看用户日志,我发现几个共同点:

  1. 所有用户都在包含WKWebView的视图控制器中
  2. 所有日志都指出应用程序在崩溃之前收到了"applicationWillResignActive"信号
  3. 堆栈显示一个键盘已打开,但我们没有办法在该视图控制器上打开键盘
  4. 所有用户都使用iOS 10.3及以上版本

唯一符合的情况是,在应用程序有可见的WKWebView时,用户收到了iMessage并使用强制触摸进行了快速回答。我们测试了这种情况,然后应用程序就崩溃了。

所以我们找到了崩溃的原因,但我们不知道具体发生了什么。是否有人遇到过这个问题或者有任何想法?

谢谢


1
你能否用从头开始构建的项目来重现这个问题(只需最小设置+ WKWebView)? - idmean
我赞同使用单独的项目进行复现。同时,在你当前实际崩溃的项目中,在[CALayer setPosition:]上设置一个符号断点,并通过执行po NSStringFromCGPoint(position)来打印设置的位置。还要在[UIView setFrame:]之前设置一个符号断点。再次打印框架。查看正在设置什么。查看您的Web视图的框架是否有效。检查您的约束等。 - Brandon
尝试并测试了您提到的场景,但无法产生崩溃。似乎其他地方出了问题。 - Muhammad Hassan
你尝试在applicationWillResignActive中注销键盘了吗? - Maxime
通常发生在无效的浮点值上,当你除以零时,最常返回NaN... - Mateus
显示剩余2条评论
3个回答

2
(1) 首先,请仔细检查您的布局是否正确,使用“自动布局”并确保您的约束条件正确,并设置子视图正确。尝试通过视觉调试布局,看看是否有任何奇怪的情况发生。调试->视图调试->捕获视图层次结构。 (2) 从堆栈跟踪中,我注意到键盘被呈现出来了,并且因此需要调整视图以为键盘腾出空间。很明显,这是在堆栈跟踪中出现消息时发生的。我还会尝试在AppDelegate中取消第一响应者。
- (void)applicationWillResignActive:(UIApplication *)application {
   [_wkWebView resignFirstResponder];
}

(3) 我还发现了一个bug,即WKWebView不会resignFirstResponder..这可能与以下内容有关:

Bug 167898 - [iOS] -[WKWebView becomeFirstResponder]和-[WKWebView resignFirstResponder]在非编程第一响应者更改发生时不会被调用

也许一个解决方法是在你的应用程序将要resign时立即呈现另一个视图。

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

2

不确定是否对您有帮助。我也曾遇到NAN问题,如果任何值损坏或无效,则会出现此问题。因此,如果您可以找出您的值在哪里被损坏,这意味着它打印NAN,那么您可以在其上放置警卫语句。


0

在Xcode运行方案中设置CG_NUMERICS_SHOW_BACKTRACE环境变量,它将会转储导致非数字值出现的堆栈跟踪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接