Android

AndroidでWebViewを使用する時に押さえておきたいポイント5選

投稿日:

はじめに

こんにちは。カイザーです。
最近、アプリはWebViewだけで、機能はWEB側で実装されるという、いわゆる「ガワネイティブ」アプリを実装する機会がありました。
その時、「スマホのChromeではちゃんと動いているのに、WebViewだと動かない!!」ということが多々あったので、紹介していきます!

JSのAlert, Confirm, Promptが表示されない!

まず、JavaScriptがWebViewの標準で無効になっているので、有効にしてあげましょう。

そして、WebChromeClientに対応するメソッドを実装していきます。
1番簡単なのは、下記のように、それぞれ全てfalseを返してあげることです。

表示結果は下記のようになります。(Confirmの場合)

「file:// のページ」というタイトルは、自動的に付加されます。
これを変更したい場合には、下記のように自前で表示させる必要があります。
※ダイアログ表示にMaterialDialogsを使用しています。

実行結果は以下のようになります。

読み込み中の進捗を表示する

重いページを読み込むときは、ユーザにその進捗率を見せた方が良いでしょう。
先ほどのChromeWebClientに「onProgressChanged」というメソッドが定義されているので、こちらを実装します。

これはActivityのコードですが、progressBarというIDで、Progress Bar(Hrizontal)を設置しています。
なお、newProgress引数には、0〜100の値が入るため、ProgressBarのMaxは100にしておきましょう。

UserAgent

アプリアクセスをサーバサイドで判断する場合などにおいて、WebViewに独自のUserAgentを設定しなければならない場合もあると思います。
その場合は、下記のように設定します。

この例では、既存のuserAgentStringに、文字列を連結しているため、既存のUserAgentと共に、設定したいUserAgentが連結された上で、送信されます。
なお、「+=」ではなく「=」とすれば、既存のUserAgentをそのまま上書きできます。

クリアテキスト設定

アプリ内で平文通信を行わない、もしくは行うとしても限定的、というアプリの場合、意図しない平文通信が行われないよう、対策をしておきましょう。
クリアテキスト設定自体は、Android 6から使用可能ですが、WebViewに適用されるのはAndroid 7からです。
また、Android 9では、デフォルトでクリアテキストが無効になっているため、HTTP通信できません。
そのため、どうしてもHTTP接続をしたい場合は、後述するドメイン単位での許可を行う必要があります。

クリアテキストを無効にする

AndroidManifest.xmlを開き、applicationの開始タグに下記を追加します。

これで、クリアテキストが無効となり、HTTP通信が不可能になります。(Android 9では、設定せずともデフォルトでfalseです)

HTTP許可ドメインを設定する

止むを得ず、一部ページがクリアテキストである場合は、ドメイン単位で許可することができます。
まず、res/xmlフォルダを作り、下記のようなXMLを作成します。

今回は、domainタグで「includeSubdomains」をtrueとしているため、kantei.go.jpのサブドメインも対象としています。
ファイル名は「network_security_config.xml」とします。

そして、AndroidManifestのapplication開始タグに下記を加えます。

これで、WebViewでアクセスしてみると、「http://www.kantei.go.jp/」などが表示できます。

クリアテキストを許可する

非推奨ですが、HTTPを全体的に許可したい場合は、クリアテキスト自体を許可します。
Android 9未満ではデフォルトで許可されていますが、Android 9からデフォルトで不許可であるため、明示的に許可を宣言します。
「AndroidManifest.xml」を開き、applicationの開始タグに下記を設定します。

これで、クリアテキストが許可されます。

ファイルダウンロードの実装

JavaScriptの「Blob」を使用して、JavaScriptで生成されたファイルをダウンロードさせる場合、WebView内からデータを取り出す必要があるため、「DownloadListener」と埋め込みJavaScript発行による実装が必要になります。(実装にあたりこちらを参考しました。)

DownloadListenerの実装

JavaScriptの文字列を生成し、「webView.loadUrl(js)」で実行させます。(ブックマークレットと同じ仕組みです。)
JavaScriptの内容はシンプルで、「XMLHttpRequest」を使用して、受け取ったURLを読み込ませます。
読み込みが完了したら、「AndroidNative.onDownloadBlob()」を呼び出すことで、コールバックします。この関数は、後ほど定義していきます。

JavascriptInterfaceの実装

JavaScriptからコールバックされる「AndroidNative.onDownloadBlob()」を定義します。

メソッドのインタフェースが、そのままJSから呼び出せる関数になります。
XHRのResultはBase64ですが、先頭にBase64ではないデータが入っているため、それを正規表現で取り除いています。
あとは、素のBase64をデコードし、ファイルに書き込むだけです。
なお、この場合下記のパーミッションをAndroidManifestに記載し、ランタイムパーミッションの実装も必要になります。

ランタイムパーミッションの実装についてはここでは省略します。
実装にはこちらにページが参考になります。

JavascriptInterfaceの登録

JavascriptInterfaceを実装後、WebViewにあらかじめ登録しておく必要があります。

第1引数には作成したJavascriptInterfaceのインスタンスを、第2引数にはインタフェース名を設定します。
(“AndroidNative.onDownloadBlob()”の、「AndroidNative」の部分になります。)
これで完了です。

さいごに

WebViewアプリを作ると言っても、Chromeアプリとはかなり異なる挙動をする場合が多くあります。
こういった事例は他もまだあるので、続編にて紹介したいと思います!

おすすめ書籍

Kotlinスタートブック -新しいAndroidプログラミング Kotlinイン・アクション 速習 Kotlin: Javaより簡単!新Android開発言語を今すぐマスター 速習シリーズ

blog-page_footer_336




blog-page_footer_336




-Android
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Kotlinをはじめよう〜Kotlin基本文法〜

1 はじめに2 事前準備3 基本データ型4 変数5 条件分岐 if式6 条件分岐 when式7 繰り返し制御 while文8 繰り返し制御 for文9 さいごに10 おすすめ書籍 はじめに こんにちは ...

【Androidマテリアル】Ripple Effect

1 はじめに2 Ripple Effectとは3 設定方法4 カスタマイズ5 さいごに はじめに こんにちは、ソニーから新Aiboが発表されましたね。個人的には欲しいと思っているのですが、最近Goog ...

[Kotlin]DatePickerDialogとTimePickerDialogを使って見た。

1 はじめに2 Anko Commons3 DatePickerDialog3.1 DatePickerFlagment3.2 呼び出し方4 TimePickerDialog4.1 TimePicke ...

Kotlin MPAndroidChartライブラリを使いボリンジャーバンドを描画してみる。

1 はじめに2 ボリンジャーバンドとは2.1 ライブラリの導入2.2 描画の準備3 ボリンジャーバンドを描画する3.1 CombinedChartの設定3.2 CombinedChart用のデータ作成 ...

Android StudioのInstant Runの種類

1 はじめに2 概要3 全部で3種類4 コールドスワップになる条件5 ビルドおよびデプロイが実行される条件6 再実行について7 参考ページ8 さいごに はじめに はじめまして、nomuraと申します。 ...

フォロー

blog-page_side_responsive

2019年2月
 12
3456789
10111213141516
17181920212223
2425262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。