问题描述
情况如下:有很多用户升到了Android 9.0系统。然后我们公司的同事发现,以往常用的三种 js和原生Java交互的方式,失效了:
方式1:通过 WebView的addJavascriptInterface()进行对象映射
@JavascriptInterface
方式2:通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url
方式3:通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调
拦截JS对话框alert()、confirm()、prompt() 消息
(以上3种方式,都无法实现 js和原生Java交互。在 Android 9.0 版本之下。)
而且,还出现了以下问题:
在WebView的网页中,通过 document.location.href = 'https://www.baidu.com',
类似这样的代码,
无法实现网页跳转。
(此处,为了避免 Android 9.0 对于 http协议的安全限制,这里采用了 https://头的协议。)
(也可能因为这个无法跳转的原因,导致shouldOverrideUrlLoading ()回调拦截 url ,无法生效???)
问题出现的环境背景及自己尝试过哪些方法
网上似乎很难找到相关的资料?
我只在 StackoverFlow,看到了2篇, WebView不能正常 loadUrl的文章,但这似乎 和本问题无关。
相关代码
因为源代码过于冗长,这里就先不贴上来了。
现有的 Android端源代码,以及 WebView里面的代码,
在 Android 8.1 至 Android 4.4.4 的版本之间,
都是可以正常运行、正常实现 js和原生Java 的交互的。
目前经过试验的结果,只有 Android 9.0 系统的Android机器,出现了本次描述的问题。
你期待的结果是什么?实际看到的错误信息又是什么?
Android 9.0 ,不能用老方式实现 js和原生之间交互,的原因是什么?
是不是因为 9.0 新特性的出现,需要 修改部分代码?
有没有什么我没注意到的 WebView配置的坑?
或者,应该采用什么新的办法,来兼容 Android 9.0 平台之上的 js和原生Java之间的交互?
这个问题目前有答案了吗?