Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

6.3 UIWebView

ginrou edited this page May 1, 2013 · 3 revisions

iOSアプリを作っていて、リンクなどを毎回Safariで開くのではなくアプリの中で開きたいということがあると思います。そのような時に使えるコンポーネントとしてUIWebViewがあります。 この章ではそのUIWebViewの使い方と、UIWebViewを使った演習を行います。

UIWebViewの基本的な使い方

UIWebViewはUIScrollViewのプロトコルに準拠したUIViewのサブクラスで、単体でほぼ一つのブラウザとしての働きをすることができます。 何かのviewとしてUIWebViewのインスタンスを生成し、NSURLRequestのインスタンスと共にloadRequestメソッドを実行することで読み込みを開始します。

ユーザーがリンクをタップした時の遷移や、Cookieに関する処理も自動的に行います。戻る、進む、リロードなどの処理もそれぞれ - (void)goBack, - (void)goForward, - (void)reloadなどのメソッドを呼ぶことで実現することが出来ます。

UIWebViewのサンプル

  1. Xcodeから新しいプロジェクトを作り、Single View Applicationをテンプレートとして開いてください。そしてViewControllerのxibでUIWebViewのコンポーネントを追加し、ソースコードと結びつけてください。 https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/6.3/drop_webview.png
  2. リクエストを読み込みます
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://mixi.jp"]];
[_webView loadRequest:request];

すると、次のようなmixiのログイン画面が出てくると思います。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/6.3/web_view_1.png

ログインする、遷移するなどすこしいじってみてください。 ログインや遷移なども全て自動で行ってくれることがお分かりかと思います。

WebViewへのフック

フックとしてdelegateが用意されており、delegateをセットすることでwebviewの状態が変化した時に情報を取得することが出来ます。 プロトコルには以下のようなものがあります

メソッド名 説明
webViewDidStartLoad: WebViewが新しい画面のロードを開始した時に呼ばれます
webViewDidFinishLoad: WebViewのロードが完了した時に呼ばれます
webView:didFailLoadWithError: WebViewが読み込みに失敗した時に呼ばれます。失敗の内容についてはerrorに含まれます
webView:shouldStartLoadWithRequest:navigationType: webViewが読み込みを行うかどうかを判断し、BOOL値を返します。引数として今から読み込みたいリクエストとクリック、戻る、進むなどのnavigationTypeが渡されます。一部のURLではSafariに遷移するなどの用途として使います

詳細な説明はこちらをご覧ください http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIWebViewDelegate

先ほどのサンプルに追加を行いこのデリゲートメソッドを実際に実装してみます。

  • プロトコルへの準拠を宣言し、viewDidLoadで_webView.delegate = self;とします。
  • リクエスト開始前へのフックとしてwebView:shouldStartLoadWithRequest:navigationType:を追加します。今回はリクエストをコンソールに表示します
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"%@", request);
    return YES; // YESを返さないとそこからの処理が進みません
}

出力結果は以下のようになりました。

2013-04-30 18:41:31.615 WebViewSample[82864:c07] <NSMutableURLRequest https://mixi.jp/>
2013-04-30 18:41:44.802 WebViewSample[82864:c07] <NSMutableURLRequest https://mixi.jp/login.pl?from=login1>
2013-04-30 18:41:44.975 WebViewSample[82864:c07] <NSMutableURLRequest https://mixi.jp/check.pl?n=%2Fhome.pl>
2013-04-30 18:41:44.996 WebViewSample[82864:c07] <NSMutableURLRequest https://mixi.jp/home.pl>
2013-04-30 18:41:45.039 WebViewSample[82864:c07] <NSMutableURLRequest http://mixi.jp/home.pl>

Cookieを持っていない状態だったので一度login画面にリダイレクトされ、ログイン完了後にメイン画面であるhome.plへ遷移しているのが分かります。

-stringByEvaluatingJavaScriptFromString:

UIWebViewにはアプリからWebViewへJavaScriptを実行できるメソッド、stringByEvaluatingJavaScriptFromStringがあります。 このメソッドのおかげでTriainaのようにWebとネイティヴをハイブリッドさせたアプリを作ることができます。

このメソッドで直接DOMを直接取得することはできません。しかしDOMの操作や単一の値として取得できるもの(高さなど)は取得することができます。例えばmixi.jp/home.plの一部の画面の背景を赤色にする場合は以下のようにすることで変更できます。

[webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName('cpMoreLink08')[0].style.backgroundColor='red'"];

実行のタイミングは、webViewのロード完了時などです。

WebViewのデバッグ

iOS6, Mac版Safari6を用いることでiOSのSafariのインスペクタを表示することができました。 このインスペクタをSafari以外のアプリのWebViewでも利用することができます。

アプリのWebViewが表示されている状況で、Mac Safariのメニューバー→開発→iPhone Simulatorと辿ることで現在実行中のアプリのweb インスペクタを利用することができます。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/6.3/inspector_1.png

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/6.3/inspector_2.png

細かい利用法などはこちらをご覧ください

http://developer.apple.com/library/ios/#documentation/AppleApplications/Reference/SafariWebContent/DebuggingSafarioniPhoneContent/DebuggingSafarioniPhoneContent.html#//apple_ref/doc/uid/TP40006515

演習 ブラウザコンポーネントの作成

UIWebViewを使った演習としてブラウザコンポーネントを作ります。

仕様は以下の通りになります。

  • ナビゲーションバーとツールバーが表示されている
    • ナビゲーションバーのタイトルには各ページのタイトルが表示されている。遷移するごとに切り替わる
    • ツールバーには戻るボタンと進むボタン、リロードがついている
      • 戻るがないとき、進むがないときはボタンがdisableになっている
  • 最初のリクエストは http://mixi.jp からとする

以下に完成図を示します。

https://raw.github.com/mixi-inc/iOSTraining/master/Doc/Images/6.3/web_view_result.png

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally