Android WebViewのページ読み込みイベントハンドリング

どハマってしまったので共有。

Webアプリで、万歩計的な機能と連携するためにネイティブアプリ内のWebViewを使ってる。ネイティブアプリ側のログインユーザーとWebアプリ側のログインユーザーと一致しないといけないので、勝手にWebアプリ側でログインされると困る。Webアプリ側でloginページを開かれたときには、ネイティブアプリ側のログイン画面を開いてそこで認証した情報をWebアプリ側に落としたい。WebアプリはAngular + Firebase。

ググると最初に shouldOverrideUrlLoading 使え的な事出てくるのね。でも、これは自分のケースではだめだった。なぜならば、そのイベントハンドラはメソッドがGETのときにだけ発火する仕様なのだけれど、Webアプリには「トークンの有効期限が切れたらログインページに送っとけ」ってのがあって、それはAngular的にはPOST実装されてるっぽいから。知らんけど。とりあえずこのイベントハンドラが呼び出されることはなかったからそうじゃないかと思ってる。

で、POSTも拾いたいならば onPageStarted を拾え的な事書いてあるのね。でもこれもだめ。なぜならば、上でも言ってる「Webアプリには「トークンの有効期限が切れたらログインページに送っとけ」って挙動、onPageStartedでは「トークンが切れてないと思って開こうとしてるURLを開こうとしてる」のタイミングで発火するので、引数のurlはログインページにリダイレクトされる前のURL。

で、少なくとも手元の端末で挙動を確認した限り、解決策は onPageFinished を拾うこと。これだと、上の「トークンの有効期限が切れたらログインページに送っとけ」の挙動で「トークンが切れてないと思って開こうとしてるURLを開こうとしたけど諦めちゃった」と、「諦めてPOSTでリダイレクトした(日本語おかしい?)loginページが読み込めたよ」の2回呼び出されるから。2回めの呼び出しではurl引数にしっかりとログインページのURLが渡ってきました。

めでたしめでたし。こんなことに3時間ハマっちまったよ・・・

コメントを残す

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