fix(payverse-webview): webView 세팅 조정을 통해 네이버페이가 동작하지 않던 버그 수정

- 참고: line 315 ~ 325
This commit is contained in:
2025-10-15 15:39:34 +09:00
parent a90f4b1c5a
commit 0b775ed380

View File

@@ -2,11 +2,16 @@ package kr.co.vividnext.sodalive.mypage.can.payment
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.view.View import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebSettings
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.widget.TextView import android.widget.TextView
@@ -26,6 +31,7 @@ import kr.co.vividnext.sodalive.BuildConfig
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivityCanPaymentBinding import kr.co.vividnext.sodalive.databinding.ActivityCanPaymentBinding
import kr.co.vividnext.sodalive.extensions.formatMoney import kr.co.vividnext.sodalive.extensions.formatMoney
@@ -53,8 +59,16 @@ class CanPaymentActivity : BaseActivity<ActivityCanPaymentBinding>(
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
private lateinit var loadingDialog: LoadingDialog
override fun onDestroy() {
loadingDialog.dismiss()
super.onDestroy()
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun setupView() { override fun setupView() {
loadingDialog = LoadingDialog(this, layoutInflater)
canResponse = IntentCompat.getParcelableExtra( canResponse = IntentCompat.getParcelableExtra(
intent, intent,
Constants.EXTRA_CAN, Constants.EXTRA_CAN,
@@ -298,19 +312,103 @@ class CanPaymentActivity : BaseActivity<ActivityCanPaymentBinding>(
val webView: WebView = binding.webviewPayverse val webView: WebView = binding.webviewPayverse
webView.visibility = View.VISIBLE webView.visibility = View.VISIBLE
webView.settings.allowFileAccess = false
webView.settings.allowContentAccess = false
webView.settings.displayZoomControls = false
webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE
webView.settings.domStorageEnabled = true
webView.settings.javaScriptEnabled = true webView.settings.javaScriptEnabled = true
webView.settings.javaScriptCanOpenWindowsAutomatically = true
webView.settings.loadsImagesAutomatically = true
webView.settings.loadWithOverviewMode = true
webView.settings.useWideViewPort = true
webView.settings.setSupportMultipleWindows(true)
webView.webViewClient = object : WebViewClient() { webView.webViewClient = object : WebViewClient() {
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
loadingDialog.dismiss()
}
override fun onReceivedError(
view: WebView?,
errorCode: Int,
description: String?,
failingUrl: String?
) {
loadingDialog.dismiss()
}
override fun onPageFinished(view: WebView, url: String) { override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url) super.onPageFinished(view, url)
loadingDialog.dismiss()
if (
url == "file:///android_asset/payverse_starter_debug.html" ||
url == "file:///android_asset/payverse_starter.html"
) {
val escaped = JSONObject.quote(jsonForJs) val escaped = JSONObject.quote(jsonForJs)
view.evaluateJavascript("startPay($escaped)", null) view.evaluateJavascript("startPay($escaped)", null)
} }
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
loadingDialog.show(screenWidth)
}
override fun shouldOverrideUrlLoading( override fun shouldOverrideUrlLoading(
view: WebView, view: WebView,
request: WebResourceRequest request: WebResourceRequest
): Boolean { ): Boolean {
val url = request.url.toString() val url = request.url.toString()
return handleUrl(view, url)
}
@Deprecated("Deprecated in Java")
@Suppress("DEPRECATION")
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
return handleUrl(view, url)
}
return super.shouldOverrideUrlLoading(view, url)
}
}
webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
if (newProgress >= 100) {
loadingDialog.dismiss()
}
}
}
if (BuildConfig.DEBUG && appScheme.contains("test", ignoreCase = true)) {
webView.loadUrl("file:///android_asset/payverse_starter_debug.html")
} else {
webView.loadUrl("file:///android_asset/payverse_starter.html")
}
} catch (e: Exception) {
Logger.e(e.message ?: "payverse start error")
Toast.makeText(
applicationContext,
"결제 초기화에 실패했습니다.",
Toast.LENGTH_LONG
).show()
binding.webviewPayverse.visibility = View.GONE
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
intent?.data?.let { handlePayverseDeeplink(it) }
}
private fun handleUrl(view: WebView, url: String): Boolean {
val appScheme = BuildConfig.APPSCHEME
if (url.startsWith("$appScheme://")) { if (url.startsWith("$appScheme://")) {
startActivity(Intent(Intent.ACTION_VIEW, url.toUri())) startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
return true return true
@@ -325,23 +423,6 @@ class CanPaymentActivity : BaseActivity<ActivityCanPaymentBinding>(
} }
return BootpayUrlHelper.shouldOverrideUrlLoading(view, url) return BootpayUrlHelper.shouldOverrideUrlLoading(view, url)
} }
}
if (BuildConfig.DEBUG && appScheme.contains("test", ignoreCase = true)) {
webView.loadUrl("file:///android_asset/payverse_starter_debug.html")
} else {
webView.loadUrl("file:///android_asset/payverse_starter.html")
}
} catch (e: Exception) {
Logger.e(e.message ?: "payverse start error")
Toast.makeText(applicationContext, "결제 초기화에 실패했습니다.", Toast.LENGTH_LONG).show()
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
intent?.data?.let { handlePayverseDeeplink(it) }
}
private fun handlePayverseDeeplink(uri: Uri) { private fun handlePayverseDeeplink(uri: Uri) {
val resultStatus = uri.getQueryParameter("resultStatus") val resultStatus = uri.getQueryParameter("resultStatus")
@@ -372,6 +453,7 @@ class CanPaymentActivity : BaseActivity<ActivityCanPaymentBinding>(
}, },
onFailure = { onFailure = {
Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show() Toast.makeText(applicationContext, it, Toast.LENGTH_LONG).show()
binding.webviewPayverse.visibility = View.GONE
} }
) )
} }