質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS 8

iOS 8(アイ・オーエス8)は、アップル社が2014年9月に発表したオペレーティングシステムです。iPhone 4sより対応しています。デザイン性の変更はなく、アプリや各種機能が強化されています。また、サードパーティ開発者のために、多くのAPIが開放されています。

Q&A

解決済

1回答

3481閲覧

UIWebViewのサブビューUIWebBrowserViewでクラッシュ発生

highchops1981

総合スコア12

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS 8

iOS 8(アイ・オーエス8)は、アップル社が2014年9月に発表したオペレーティングシステムです。iPhone 4sより対応しています。デザイン性の変更はなく、アプリや各種機能が強化されています。また、サードパーティ開発者のために、多くのAPIが開放されています。

0グッド

0クリップ

投稿2016/02/15 10:07

編集2016/02/16 03:33

私がリリースしたアプリを使用しているユーザの端末でクラッシュが発生しました。
ユーザはアップルストアからアプリをダウンロードしています。

クラッシュログをみると、どうやらwebViewの表示でクラッシュしているようです。
webViewでロードしているのはphpファイルです。
このアプリは2ヶ月ほど運用しており、日々1000人ほどが利用していますが、
発生したのはこの2ヶ月で3回です。
発生頻度は高くなく、再現させることができず、有力な情報がない状況です。
このクラッシュについて情報をお持ちの方がいましたら共有いただきたく。
実際のコードとクラッシュログを下記に記載します。

環境:iPad Air (Wi-Fi Only) iOS8.3

webViewを作成しているコードは下記です。

- (void)loadWebView { // UIWebViewのインスタンス化 self.scheduleWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,displayWidth,displayHeight)]; // webページのサイズを自動的に画面にフィット self.scheduleWebView.scalesPageToFit = YES; // バウンスを無効化 self.scheduleWebView.scrollView.bounces = NO; // スケジュール一覧をロード self.scheduleWebView.delegate = self; NSString *path = [NSString stringWithFormat:@"%@://%@/%@/xxxx.php",kAppServerAccessProtocol,kAppServerDomain,kAppAPIWhiteCom]; NSURL *url = [NSURL URLWithString:path]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.scheduleWebView loadRequest:request]; [self.view addSubview:self.scheduleWebView]; self.scheduleWebView.delegate = self; }

webViewを破棄しているコードは下記です。
アラートで2番目のボタンが押されて時にwebViewを破棄して次処理に移ります。

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch (buttonIndex) { case 0: //1番目のボタンが押されたときの処理 break; case 1: //2番目のボタンが押されたときの処理 //webView破棄 self.scheduleWebView.delegate = nil; [self.scheduleWebView stopLoading]; self.scheduleWebView = nil; //次処理へ AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; [appDelegate logout]; break; } }

収集したクラッシュログは下記です。

Thread 0 Crashed: 0 libobjc.A.dylib 0x00000001986f7bd0 objc_msgSend + 16 1 UIKit 0x000000018beb2f34 <redacted> + 536 2 UIKit 0x000000018beb2f10 <redacted> + 500 3 UIKit 0x000000018beb2f10 <redacted> + 500 4 UIKit 0x000000018beb2f10 <redacted> + 500 5 UIKit 0x000000018beb2f10 <redacted> + 500 6 UIKit 0x000000018beb2ccc -[UIWebBrowserView _collectAdditionalSubviews] + 420 7 UIKit 0x000000018beb2af4 -[UIWebDocumentView _updateSubviewCaches] + 64 8 UIKit 0x000000018be8cb08 -[UIWebDocumentView webViewDidCommitCompositingLayerChanges:] + 52 9 UIKit 0x000000018be8c7e4 -[UIWebBrowserView webViewDidCommitCompositingLayerChanges:] + 88 10 CoreFoundation 0x000000018723e100 <redacted> + 144 11 CoreFoundation 0x000000018713a2fc <redacted> + 296 12 CoreFoundation 0x000000018713ee30 <redacted> + 68 13 WebKitLegacy 0x0000000196654898 -[_WebSafeForwarder forwardInvocation:] + 172 14 libdispatch.dylib 0x0000000198d35994 <redacted> + 24 15 libdispatch.dylib 0x0000000198d35954 <redacted> + 16 16 libdispatch.dylib 0x0000000198d3a20c _dispatch_main_queue_callback_4CF + 1608 17 CoreFoundation 0x00000001871ef7f8 <redacted> + 12 18 CoreFoundation 0x00000001871ed8a0 <redacted> + 1492 19 CoreFoundation 0x00000001871192d4 CFRunLoopRunSpecific + 396 20 GraphicsServices 0x00000001907df6fc GSEventRunModal + 168 21 UIKit 0x000000018bcdefac UIApplicationMain + 1488 22 MyApp(このプロセスは私のアプリです) 0x0000000100130760 _mh_execute_header + 247648 23 libdyld.dylib 0x0000000198d62a08 <redacted> + 4

※クラッシュログの収集方法ですが、quincykit(http://quincykit.net/)というthird partyを使用して収集しています。具体的には、ユーザの端末でクラッシュが発生すると、そのクラッシュログを端末に保持し、次回アプリ起動時に保存したクラッシュログを私宛にメールするようになっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「アップルストアからダウンロードしたアプリ」とのことですが、あなた自身が作ってAppStoreに公開したアプリの話ですか?
22エントリ目が「MyApp」となっていますが、実際にはあなたが作ったアプリ名が表示されているのですか?
今の説明だと他人が作ったアプリをダウンロードして、それがクラッシュする原因を調べようとしているように聞こえるのですが、それだと自身のアプリ開発の話ではなく他人のアプリをハッキングする話になってしまうので、その点ははっきりしておいた方がよいと思います。また、自分の端末で発生した話なのか、他のユーザーで発生したクラッシュログを入手したのか、クラッシュログを入手した方法も補足しておいた方がよいと思います。
いずれにしてもこのクラッシュログにはアプリ自身のモジュールが見当たらないので、これだけで原因を特定するのは難しいだろうと思いますが、雰囲気的には、UIWebViewの使用方法やdelegateメソッドの実装に誤りがあってUIWebViewの実行に影響を与えているケースがあるんだろうなという気がします。

投稿2016/02/15 16:50

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

highchops1981

2016/02/16 01:23

ご指摘ありがとうございます。 ご質問に回答いたします。 まず、このアプリは私が作成し、AppStoreに公開したものになります。 また、このクラッシュは私ではなくユーザの端末で発生したものです。 クラッシュログの収集方法ですが、quincykit(http://quincykit.net/)というthird partyを使用して収集しています。具体的には、ユーザの端末でクラッシュが発生すると、そのクラッシュログを端末に保持し、次回アプリ起動時に保存したクラッシュログを私宛にメールするようになっています。 あと、アプリのモジュールも掲載するようにします。
TakeOne

2016/02/16 06:07 編集

コードを見させて頂いて、一点気になったのは ------------------------------------- self.scheduleWebView.delegate = nil; [self.scheduleWebView stopLoading]; ------------------------------------- の部分です。 これだとdelegateをnilにしてからstopLoadingしているので もしかすると、stopLoadingの延長で何かdelegateイベントが 発生した時にクラッシュするかもしれないというのが気になりました。 (ガードがしっかりしているAPIならこれで問題ないとは思いますが) で、「UIWebView stopLoading delegate」で検索してみたところ http://www.zero4racer.com/blog/642 で、やはり落ちることがあるという記事がありました。 あなたのプロジェクトでこれと同じことが起きているかどうかはわかりませんが、 参考にするとよいと思います。
TakeOne

2016/02/16 06:30 編集

すみません。追伸します。 http://www.zero4racer.com/blog/642 で書かれているのは、stopLoadingより先に delegateをnilにした方が落ちないと言っているようで、 むしろ今のコーディングでよいようです。 役に立たないコメントですみませんでした。 ちなみにUIWebViewには開発者レベルではどうにもならないクラッシュ問題が潜んでいるようで、ChromeはUIWebViewからWKWebViewに切り替えたことでクラッシュ数が70%減ったそうです。 (参考) http://qiita.com/ShingoFukuyama/items/01a9cdf24090931b4ef3 頻発するものでなければ、しばらく様子見とし、 気になるようならWKWebViewへの切り替えを検討した方がよいのかも しれません。
highchops1981

2016/02/17 02:15

ご回答ありがとうございます。 貴重なご意見大変参考になりました。 現状、頻度が少ないのが救いとなっています^^ 仰るとおりしばらく様子を見て、 運用にたえられないようであれば、WKWebViewへの切り替えを検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問