118
118

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UIWebViewを使うときに気をつけていること

Posted at

ローディングを表示する

UIWebViewではページ表示するまでは、だいたい白い画面の状態で待たされます。
特に重いページを表示する場合、白い画面のまま固まったように見えてしまい、あまりよろしくないです。

ローディングを早くすることは(場合によりますが)難しいので、
心理的な対策としてアクティビティインジケータを入れるのが効果的です。
(UIWebViewにかぎらず、通信が発生するときは基本入れます)

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

↓らへんのライブラリを使うのも良いです。

MBProgressHUD

Demoの使い方そのままだと、インジケータ表示中はUIが操作できなくなるので
その場合はuserInteractionEnabled = NOにしておきます。

_hud.userInteractionEnabled = NO;

(もちろん、意図的にUIを操作させたくない場合はこの限りではないです)

SVProgressHUD

オブジェクトを生成する必要がなく、クラスメソッド一本で使えるため
MBProgressHUDより気軽に導入できます。

キャッシュを消す

UIWebViewは、キャッシュが非常に強いようで
アプリを再起動するだけではキャッシュが消えないことがあります。

そのため、更新性の高いWebコンテンツを表示する場合は、
UIWebViewの読込み直前にキャッシュを消すことで防止できます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //キャッシュを全て消去
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    

mailto:// でメールアプリが起動しないことがある

UIWebViewで表示しているページでmailtoリンクを踏んだとき、
メールアプリが起動しないケースがたまに…

読込み前にmailtoを判定することで、メールアプリを開けます。

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if([[[request URL] scheme] isEqual:@"mailto"]){
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }
    
118
118
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
118
118

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?