iOS 9 键盘:此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃
Posted
技术标签:
【中文标题】iOS 9 键盘:此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃【英文标题】:iOS 9 keyboard: This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes 【发布时间】:2015-09-25 09:21:46 【问题描述】:当我从嵌入 web 视图的文本视图中启动第三方键盘时,有时会导致应用程序崩溃。
应用崩溃时可以找到一些证据:
-
总是有如下警告,但是当键盘显示成功时,可能也会显示警告。
""Sep 25 16:44:09 iPhone6-golden XXX[2916] : 此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃。这将在未来的版本中导致异常。""
Stack:(
0 CoreFoundation 0x00000001836f4f74 <redacted> + 148
1 libobjc.A.dylib 0x00000001982e7f80 objc_exception_throw + 56
2 CoreFoundation 0x00000001836f4ea4 <redacted> + 0
3 Foundation 0x000000018470e5d8 <redacted> + 88
4 Foundation 0x0000000184594f3c <redacted> + 56
5 Foundation 0x0000000184590afc <redacted> + 260
6 UIKit 0x0000000188d4f958 <redacted> + 64
7 UIKit 0x0000000188d50470 <redacted> + 244
8 UIKit 0x0000000188d6cf44 <redacted> + 108
9 UIKit 0x0000000189476798 <redacted> + 268
10 UIKit 0x0000000188f4dfcc <redacted> + 176
11 UIKit 0x0000000188f3d0b4 <redacted> + 52
12 UIKit 0x0000000188c4700c <redacted> + 644
13 QuartzCore 0x000000018844df14 <redacted> + 148
14 QuartzCore 0x0000000188448b20 <redacted> + 292
15 QuartzCore 0x00000001884489e0 <redacted> + 32
16 QuartzCore 0x000000018844807c <redacted> + 252
17 QuartzCore 0x0000000188447dd0 <redacted> + 516
18 QuartzCore 0x0000000188476f48 <redacted> + 236
19 libsystem_pthread.dylib 0x0000000198cf61e8 <redacted> + 584
20 libsystem_pthread.dylib 0x0000000198cf5d60 <redacted> + 136
21 libsystem_pthread.dylib 0x0000000198cf7b48 pthread_sigmask + 0
22 libsystem_pthread.dylib 0x0000000198cf7aa0 <redacted> + 0
23 libsystem_pthread.dylib 0x0000000198cf5030 thread_start + 4
)
这是应用程序崩溃,而不是键盘。您可以在 Xcode 的设备日志中找到回溯。
异常类型:EXC_CRASH (SIGABRT) 异常代码:0x0000000000000000, 0x0000000000000000 异常说明:EXC_CORPSE_NOTIFY 线程触发:18 过滤后的系统日志: 没有找到
Last Exception Backtrace:
0 CoreFoundation 0x183f20f5c __exceptionPreprocess + 124
1 libobjc.A.dylib 0x198b13f80 objc_exception_throw + 56
2 CoreFoundation 0x183f20e2c +[NSException raise:format:arguments:] + 108
3 Foundation 0x184e0ff3c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 112
4 UIKit 0x1897130e8 -[UIApplication _cachedSystemAnimationFenceCreatingIfNecessary:] + 200
5 UIKit 0x1897131ac -[UIApplication _systemAnimationFenceCreatingIfNecessary:] + 24
6 UIKit 0x1897653cc +[UIWindow _synchronizedDrawingFence] + 116
7 UIKit 0x189c137a4 -[_UIRemoteViewController synchronizeAnimationsInActions:] + 124
8 UIKit 0x189c0e158 -[_UISizeTrackingView _geometryChanges:forAncestor:] + 540
9 UIKit 0x189775fc8 -[UIView _notifyGeometryObserversWithChangeInfo:] + 272
10 UIKit 0x1894d36b4 -[UIView setCenter:] + 408
11 UIKit 0x18957ea40 -[UIView(Geometry) _applyISEngineLayoutValues] + 600
12 UIKit 0x18948e6b8 -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 136
13 CoreFoundation 0x183e17ab0 __53-[__NSArrayM enumerateObjectsWithOptions:usingBlock:]_block_invoke + 132
14 CoreFoundation 0x183e179a8 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 308
15 UIKit 0x18947d3e8 -[UIView(Geometry) resizeSubviewsWithOldSize:] + 116
16 UIKit 0x18957eb88 -[UIView(AdditionalLayoutSupport) _is_layout] + 128
17 UIKit 0x18977a210 -[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 756
18 UIKit 0x18947300c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 644
19 QuartzCore 0x188c79f14 -[CALayer layoutSublayers] + 148
20 QuartzCore 0x188c74b20 CA::Layer::layout_if_needed(CA::Transaction*) + 292
21 QuartzCore 0x188c749e0 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 32
22 QuartzCore 0x188c7407c CA::Context::commit_transaction(CA::Transaction*) + 252
23 QuartzCore 0x188c73dd0 CA::Transaction::commit() + 516
24 QuartzCore 0x188c6d4bc CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 80
25 CoreFoundation 0x183ed7c30 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
26 CoreFoundation 0x183ed59d4 __CFRunLoopDoObservers + 372
27 CoreFoundation 0x183e04de0 CFRunLoopRunSpecific + 416
28 WebCore 0x195a69aa0 RunWebThread(void*) + 456
29 libsystem_pthread.dylib 0x199523b3c _pthread_body + 156
30 libsystem_pthread.dylib 0x199523aa0 _pthread_start + 156
31 libsystem_pthread.dylib 0x199521030 thread_start + 4
Thread 18 name: WebThread
Thread 18 Crashed:
0 libsystem_kernel.dylib 0x000000019945b1e0 __pthread_kill + 8
1 libsystem_pthread.dylib 0x0000000199524f0c pthread_kill + 112
2 libsystem_c.dylib 0x00000001993ceb78 abort + 140
3 libc++abi.dylib 0x00000001981913f4 __cxa_bad_cast + 0
4 libc++abi.dylib 0x00000001981aaf60 std::__terminate(void (*)()) + 44
5 libc++abi.dylib 0x00000001981aab10 __cxa_rethrow + 144
6 libobjc.A.dylib 0x0000000198b14120 objc_exception_rethrow + 44
7 CoreFoundation 0x0000000183e04e68 CFRunLoopRunSpecific + 552
8 WebCore 0x0000000195a69aa0 RunWebThread(void*) + 456
9 libsystem_pthread.dylib 0x0000000199523b3c _pthread_body + 156
10 libsystem_pthread.dylib 0x0000000199523aa0 _pthread_body + 0
11 libsystem_pthread.dylib 0x0000000199521030 thread_start + 4
从崩溃堆栈中,很明显应用程序是从 WebThread 崩溃的,我猜它在显示键盘时正在更新一些 UI 细节。
但是,在 ios8.* 中一切正常。谁能给我一些关于为什么会发生这种情况的建议?或者为什么 webview 如此奇怪和与 iOS8 不同?我在苹果的文档中找不到任何更改。
提前致谢。
【问题讨论】:
你找到答案了吗?遇到同样的问题! @gregavola,抱歉,我仍然找不到解决方案。你在哪里发现问题?我的意思是哪个应用程序和哪个 3 方键盘?我想知道这是由最新的 9.0 SDK 中 UIWebView 的一些变化引起的。我发现三方键盘的高度一开始是和系统键盘一样的,但是后来它会更新高度到自定义的大小(通常不等于系统键盘)。这可能会导致 WebThread 中出现一些奇怪的 UI 更新。但是,我还不确定,因为不是所有的键盘都会导致问题,也不是 webview 中的所有 textField 都会导致崩溃。 这发生在我的应用程序 Untappd 上。试图找出原因...... 这是已确认的问题。甚至 Swype(第三方键盘)在他们的网页 swype.com/product-features/ios/known-issues.html 上也显示了这个问题,我也不知道如何防止这个问题。 嗨,@Meanteacher,谢谢你的回答,但我仍然无法理解你的意思.....(⊙o⊙)…但我在已知问题列表中找不到问题.. 【参考方案1】:我发现崩溃问题可能是由 3 方键盘的启动时间成本引起的。
我做了以下实验来比较自定义键盘与快速启动和延迟启动的时间成本。两个实验中唯一的一个变量是启动键盘时间成本。没有任何延迟的键盘看起来很稳定(我的意思是我没有发现任何崩溃),但是当我将键盘延迟大约800ms-1ms时,崩溃的风险迅速增加。
所以我想知道 WebThread 可能有一些计时器,当你的键盘出现时(这意味着自动布局引擎需要工作),它可能会触发 webview 崩溃。
【讨论】:
【参考方案2】:这实际上是由 3rd 方键盘引起的。我发现的最佳解决方案是在应用程序中禁用第 3 方键盘。您可以扩展应用委托,并使用以下代码来检测和阻止 3rd 方键盘:
- (BOOL)application:(UIApplication *)application shouldAllowExtensionPointIdentifier:(NSString *)extensionPointIdentifier
if ([extensionPointIdentifier isEqualToString: UIApplicationKeyboardExtensionPointIdentifier])
return NO;
return YES;
【讨论】:
Em,实际上,我们知道这是由 3rd 方键盘引起的。但是,这个问题是关于如何防止 3rd 方键盘导致应用程序崩溃,而不是如何防止使用 3rd 方键盘。 @Pyro,我认为您的想法确实不适用于大多数应用程序。还是谢谢大家。以上是关于iOS 9 键盘:此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iOS9 此应用程序正在从后台线程修改自动布局引擎,这可能导致引擎损坏和奇怪的崩溃