🐙
JetpackCompose WebViewでのWhiteList対応
環境
compose version 1.3.0
サンプルコード
private fun getWebViewClient(
context: Context,
webViewWhitelistItem: List<WebViewWhitelistItem>,
): AccompanistWebViewClient = object : AccompanistWebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean = if (isWhiteListMatch(webViewWhitelistItem, request?.url?.host ?: "")) {
false
} else {
Intent(Intent.ACTION_VIEW, request?.url).apply {
startActivity(context, this, null)
}
true
}
}
// rememberWebViewStateの第二引数でhttpHeadersを付与することができる
val state = rememberWebViewState(webViewEntity.url, webViewEntity.httpHeaders)
val rememberWebViewClient = remember {
getWebViewClient(
webViewEntity.context,
webViewEntity.whiteList
)
WebView(
state = state,
modifier = Modifier
.fillMaxSize(),
captureBackPresses = true,
onCreated = {
it.settings.javaScriptEnabled = true
},
client = rememberWebViewClient
)
解説
WebViewのclientにrememberWebViewClientを渡し、
(なんでrememberにしているのかはよくわからないが
WebViewのデフォルトにrememberで設定されていたのでrememberで渡している)
rememberWebViewClientの中の
override fun shouldOverrideUrlLoading()で
今まで通りのような感じで実装すれば
遷移先のURLを判定して外部ブラウザ遷移させることができる。
ハマりポイント
shouldOverrideUrlLoading()に渡すURLを
rememberWebViewStateのcurrentUrlを渡していたのだが
こちらは遷移した時点でのURLしか取得することができないようで
shouldOverrideUrlLoadingの
request: WebResourceRequest?からurlを参照することで
遷移する前のURLを取得できることがわかった。
参考記事
Discussion
良記事ありがとうございます!
ところで、Zennではマークダウンのコードブロック(```で囲むやつ)は以下のように書くと言語ごとにいい感じにハイライトしてくれます!
↓↓↓
あとタイトルもつけれたりします...
↓↓↓
つけていただけると読みやすくて助かります...お時間があれば是非....!
ありがとうございます!
次回からはそのようにやってみます!!