2016-09-16 12 views
4

iOS10でHockeyAppで次のクラッシュが発生しています。下記のようなクラッシュログを見つけてください。UIWebDocumentView _updateSubviewCachesがiOS10でクラッシュする

スレッド4はクラッシュ:

0 libobjc.A.dylib 0x0000000187242f30 objc_msgSend + 16 
1 UIKit 0x000000018e86e914 -[UIWebDocumentView _updateSubviewCaches] + 36 
2 UIKit 0x000000018e69093c -[UIWebDocumentView subviews] + 88 
3 UIKit 0x000000018e941bd4 -[UIView(CALayerDelegate) _wantsReapplicationOfAutoLayoutWithLayoutDirtyOnEntry:] + 68 
4 UIKit 0x000000018e63d770 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1248 
5 QuartzCore 0x000000018bb0640c -[CALayer layoutSublayers] + 144 
6 QuartzCore 0x000000018bafb0e8 CA::Layer::layout_if_needed(CA::Transaction*) + 288 
7 QuartzCore 0x000000018bafafa8 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 28 
8 QuartzCore 0x000000018ba77c64 CA::Context::commit_transaction(CA::Transaction*) + 248 
9 QuartzCore 0x000000018ba9f0d0 CA::Transaction::commit() + 508 
10 QuartzCore 0x000000018ba9faf0 CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 116 
11 CoreFoundation 0x00000001887a57dc __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 28 
12 CoreFoundation 0x00000001887a340c __CFRunLoopDoObservers + 368 
13 CoreFoundation 0x00000001886d2068 CFRunLoopRunSpecific + 472 
14 WebCore 0x000000018d273a2c RunWebThread(void*) + 452 
15 libsystem_pthread.dylib 0x000000018788b860 _pthread_body + 236 
16 libsystem_pthread.dylib 0x000000018788b770 _pthread_start + 280 
17 libsystem_pthread.dylib 0x0000000187888dbc thread_start + 0 

任意のアイデアは、ここで何が起こっていますか? 次のクラッシュグループのようなものも関連しています。

クラッシュグループ1

[UIWebBrowserView _collectAdditionalSubviews] 
objc_msgSend() selector name: autorelease 

クラッシュグループ2

[UIWebDocumentView subviews] 
objc_msgSend() selector name: arrayByAddingObjectsFromArray: 
+0

私も、私のアプリでは、iOS 10のアップデート後も同様のクラッシュが発生しました。 – RainCast

+0

アプリで自動レイアウトの制約を持つオブジェクトのフレームを変更しようとしていますか? – Prav

+0

クラッシュログからこのオブジェクトをWebViewにすることができます。それは確かだ ? –

答えて

1

私は、この問題を再現することができていますから、自分の質問に答えると、根本的な原因を発見しています。

以下に注意してください。

1.私はUIWebViewを使用しています。まず第一に、これはお勧めしません。

2.次の実装方法でこの問題が発生します。私は問題を示すためにここに擬似コードを書いています。

@implementation MyViewController 

    - (void)loadView { 

     //creating UIWebView Here 
     self.webView = [[UIWebView alloc] initWithFrame:_some_frame]; 

     //setting the web view properties here. 

     //Adding to the view 
     [self.view addSubView: self.webView]; 

     [self populateWebView]; 
    } 

    - (void) populateWebView { 
     [self.webView loadHTMLString:_some_html 
          baseURL:[NSURL fileURLWithPath:_some_path]]; 
    } 


    - (void)viewDidLayoutSubviews { 
     [super viewDidLayoutSubviews]; 

     if (self.webView) { 
      //The following two lines causing this issue. 
      self.webView.scrollView.contentInset = _some_insets; 
      self.webView.scrollView.scrollIndicatorInsets = _some_insets; 
     } 
    } 

@end 

3溶液を以下に示します。私の実際のコードでは

@implementation MyViewController 

    - (void)loadView { 

     //creating UIWebView Here 
     self.webView = [[UIWebView alloc] initWithFrame:_some_frame]; 

     //setting the web view properties here. 

     //Adding to the view 
     [self.view addSubView: self.webView]; 

     [self populateWebView]; 
    } 

    - (void) populateWebView { 
     [self.webView loadHTMLString:_some_html 
          baseURL:[NSURL fileURLWithPath:_some_path]]; 
    } 


    - (void)viewDidLayoutSubviews { 
     [super viewDidLayoutSubviews]; 
    } 

    - (void)webViewDidFinishLoad:(UIWebView *)webView { 
     webView.scrollView.contentInset = _some_insets; 
     webView.scrollView.scrollIndicatorInsets = _some_insets; 
    } 

@end 

、私はのUIWebViewをサブクラス化することで、ここでカスタムのWebViewクラスを使用していました。それはいくつかの問題を作成するとは思わない。根本的な原因は、 "contentInset"と "scrollIndicatorInsets"をviewDidLayoutSubviewsに設定することです。これはお勧めできません。ブレークポイントを設定すると、「viewDidLayoutSubviews」が複数回呼び出され、最終的にはアプリケーションがクラッシュします。

解決策として、コードの次の部分を "webViewDidFinishLoad"に移動しました。これは、読み込みが完了してWebViewが準備完了している場合にのみ呼び出されます。だから、このデリゲートメソッドの下でこのコードを追加するのが理にかなっています。

webView.scrollView.contentInset = _some_insets; 
webView.scrollView.scrollIndicatorInsets = _some_insets; 
+0

根本原因を知る前に、コードのどの部分が問題を引き起こしているのか分からず、クラッシュレポートにも情報がありませんでした。 –

関連する問題