WebView通信をProxyManでデバッグする方法

スポンサーリンク

導入:WebViewのUser-Agent、触ることありますか?

AndroidアプリでWebViewを使っていると、
ある日こんな依頼が飛んできます。

「このWeb、アプリからのアクセスか判別したいです」
「アプリのバージョンも一緒に送りたいです」

ここで登場するのが、User-Agent(UA)

この記事では、
WebViewのUser-Agentをカスタムして、末尾にアプリバージョンを付与する実装例を、
初心者向け → 実務の落とし穴 → 設計視点までまとめます。

先に結論です。

  • User-AgentはWebSettingsで変更できる
  • 既存UAは上書きせず「末尾に追加」が安全
  • 設定タイミングを間違えると反映されない

User-Agentとは何か(超ざっくり)

User-Agentとは、
「自分は何者か」をサーバーに伝える文字列です。

WebViewの場合、デフォルトでは
Chrome + Android端末情報が含まれています。


Mozilla/5.0 (Linux; Android 14; Pixel 7) AppleWebKit/537.36 ...

このままだと、
「アプリ経由なのか」「どのバージョンか」が分かりません。

なぜUser-Agentをカスタムするのか

実務での理由は、だいたいこの3つです。

  • アプリ / ブラウザのアクセス判別
  • アプリバージョン別の出し分け
  • 障害・ログ調査のため

特に障害調査では、
UAにアプリverが入っているかどうかで難易度が激変します。

基本:WebViewでUser-Agentを設定する

User-Agentは、WebSettingsから設定します。


val webView: WebView = findViewById(R.id.webView)
val settings = webView.settings

settings.userAgentString = "MyApp"

ただし、この書き方はおすすめしません

やってはいけない実装例

ありがちなのが、
既存のUser-Agentを完全に上書きするパターンです。


// 非推奨例
settings.userAgentString = "MyApp/1.0.0"

これをやると、
Web側でChrome判定が壊れることがあります。

正解パターン:既存UAの末尾に追加する

安全なのは、
デフォルトUA + アプリ情報です。


val defaultUa = settings.userAgentString
val appVersion = BuildConfig.VERSION_NAME

settings.userAgentString =
    "$defaultUa MyApp/$appVersion"

これで、
ブラウザ判定を壊さずに情報を追加できます。

実務向け:ユーティリティ化する

画面ごとに書くと、
確実にメンテ不能になります。


object UserAgentUtil {

    fun build(context: Context): String {
        val defaultUa = android.webkit.WebSettings.getDefaultUserAgent(context)
        val versionName = BuildConfig.VERSION_NAME
        return "$defaultUa MyApp/$versionName"
    }
}

呼び出し側はこれだけです。


webView.settings.userAgentString =
    UserAgentUtil.build(this)

設定タイミングの落とし穴

User-Agentは、
loadUrlより前に設定する必要があります。


// OK
webView.settings.userAgentString = ua
webView.loadUrl(url)

loadUrl後に変更しても、
最初のリクエストには反映されません。

よくあるハマりポイント

① ページ遷移でUAが戻る

基本的には戻りませんが、
WebViewを作り直している場合は再設定が必要です。

② JavaScriptから見たUAが違う

JSのnavigator.userAgentは、
WebViewの設定を反映します。

③ 複数WebViewでUAがズレる

WebViewごとに設定が必要です。
Applicationで一括設定はできません。

デバッグ・確認方法

  • Chrome DevToolsでUAを確認
  • サーバーログでUser-Agentを見る
  • JSでnavigator.userAgentをconsole出力

セキュリティ・運用上の注意

User-Agentは偽装可能です。
認証用途には使わないでください。

あくまで、
ログ・分析・出し分け補助用途に留めるのが安全です。

よくある質問

Q. アプリ名は英数字だけがいい?

はい。空白・日本語は避けましょう。

Q. build.gradleから直接取れない?

BuildConfig経由で取得するのが一般的です。

まとめ

  • User-Agentは上書きしない
  • 末尾にアプリ情報を追加する
  • loadUrl前に設定する

迷ったら:デフォルトUAを壊さない。
これだけ守れば事故りません。

コメント

タイトルとURLをコピーしました