🐙

JetpackCompose WebViewでのWhiteList対応

2022/11/15に公開
2

環境

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を取得できることがわかった。


参考記事

https://developer.android.com/guide/webapps/webview?hl=ja#HandlingNavigation

https://qiita.com/m-kann0/items/91d1b576569e3bc90e88

https://asahima.hatenablog.jp/entry/2017/01/08/000000

https://qiita.com/serisawa/items/b24fa444b1f09c036c70

Discussion

てべすてんてべすてん

良記事ありがとうございます!
ところで、Zennではマークダウンのコードブロック(```で囲むやつ)は以下のように書くと言語ごとにいい感じにハイライトしてくれます!


```kotlin:タイトル
val zenn = "いいかんじ"
```

↓↓↓

タイトル
val zenn = "いいかんじ"

あとタイトルもつけれたりします...

```kotlin:タイトル
val zenn = "いいかんじ"
```

↓↓↓

タイトル
val zenn = "いいかんじ"

つけていただけると読みやすくて助かります...お時間があれば是非....!