WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面

Posted

技术标签:

【中文标题】WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面【英文标题】:WebViewClient will not open page handled in shouldOverrideUrlLoading() 【发布时间】:2019-01-16 19:10:57 【问题描述】:

我正在使用 webview 来显示交易流程(通过信用卡付款)。如果我使用 webView.load(given URL) 它正在工作,它会将我从我的应用程序重定向到浏览器中的银行页面。

但我需要跟踪付款是否成功(它会将我重定向到特定的 URL)并将数据发送回服务器。

我使用了 webViewClient,但是当我使用客户端时,它不会将我重定向到浏览器页面,它将永远停留在应用程序内的“处理数据”屏幕上。即使我只添加 view.loadurl(URL) 并在 shouldOverrideUrlLoading 中返回 true,它也会做同样的事情。有 4-5 次重定向直到最终结果。 StartURL(add creditCardInfo) - 重定向到验证 - 重定向到付款确认 - 重定向到返回数据的特定 URL(如果分支)

class PurchaseWebView: AppCompatActivity() 

private lateinit var purchaseWebView: WebView
private val api: API = API.getInstance(this)
private val webViewActivity = this

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)

    setContentView(R.layout.purchase_web_view_layout)

    purchaseWebView = findViewById(R.id.webview)

    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    purchaseWebView.webViewClient = object : WebViewClient() 
        override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean 
            createLog("WebView Loading url... ", url)
            if (url.startsWith("purchase.complete.url.com", 0))
                api.purchaseCreditCardResult(url, webViewActivity, object: IPurchaseCallback
                    override fun onError(errorJSON: JSONObject) 
                        createLog("WebView Error ", errorJSON.toString())
                    

                    override fun onSuccess(purchaseJSON: JSONObject?) 
                        createLog("WebView Success ", "Finishing Activity")
                    
                )
                return false
             else 
                view.loadUrl(url)
                return true
            
        
    

    @RequiresApi(Build.VERSION_CODES.N)
    purchaseWebView.webViewClient = object : WebViewClient() 
        override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean 
            if (request.url.toString().startsWith("purchase.complete.url.com", 0))

                api.purchaseCreditCardResult(request.url.toString(), webViewActivity, object: IPurchaseCallback
                    override fun onError(errorJSON: JSONObject) 
                        createLog("WebView Error ", errorJSON.toString())
                    

                    override fun onSuccess(purchaseJSON: JSONObject?) 
                        createLog("WebView Success ", "Finishing Activity")
                    
                )
                return false
             else 
                view.loadUrl(request.url.toString())
                return true
            
        
    

    purchaseWebView.loadUrl(intent.extras.getString("purchaseURL"))


【问题讨论】:

【参考方案1】:

我认为问题出在这个特定的电话view.loadUrl(request.url.toString()) 当您覆盖 shouldOverrideUrlLoading 时,您应该只返回 truefalse,这意味着 - 允许或禁止加载传递的 url。但是,当您返回 true 并调用 loadUrl 时,您会尝试加载相同的 url 两次。删除loadUrl 命令并返回true

override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean 
    view.loadUrl(request.url.toString())   // Why?
    return true

【讨论】:

它没有帮助。我已经使用了很多教程,每个人都这样使用它。例如这里:guides.codepath.com/android/Working-with-the-WebView 它仍在我的应用程序中(我将从服务器获取第一个 URL 作为购买响应)。第一个 URL 将重定向我(在应用程序内)以填写信用卡信息。当我确认这些数据时,它会将数据发送到某个地方(它的银行 API)。当我等待确认时,有加载圈。之后它将打开默认浏览器并将我重定向到另一个页面。这就是没有 WebViewClient 的工作方式。当我使用 WebViewClient 时,我卡在数据确认页面上,并且加载圈永久存在。看起来它会拒绝打开浏览器。 @martin1337,这可能是因为WebView 试图在单独的窗口中打开网址吗? (检查这个答案***.com/a/49793597/3569545)。

以上是关于WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面的主要内容,如果未能解决你的问题,请参考以下文章

从 Android WebViewClient 中的网站下载 Blob 文件

Android WebViewClient,有404时不会调用onErrorReceived

停止在 webViewClient 中加载

在 Android WebViewClient 中获取空白页

获取网页浏览中点击图片的链接

WebViewClient 与 WebChromeClient