導入: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を壊さない。
これだけ守れば事故りません。


コメント