AndroidManifest.xml에서 권한추가를 아래와 같이 설정해주세요.
Copy <!-- AndroidManifest.xml 인터넷 사용권한 추가 -->
<manifest ...>
<uses-permission android:name=”android.permission.INTERNET”/>
</manifest>
웹뷰 필수 설정값을 아래와 같이 설정해주세요.
Copy // Java
WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
// 필수 세팅값
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setDomStorageEnabled(true);
// optional 세팅값
webSettings.setLoadsImagesAutomatically(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setUseWideViewPort(true);
webSettings.setDatabaseEnabled(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
Copy // Kotlin
val myWebView: WebView = findViewById(R.id.webview);
// 필수 세팅값
myWebView.settings.javaScriptEnabled = true;
myWebView.settings.javaScriptCanOpenWindowsAutomatically = true;
myWebView.settings.domStorageEnabled = true;
// optional 세팅값
myWebView.settings.builtInZoomControls = false;
myWebView.settings.loadWithOverviewMode = true;
myWebView.settings.useWideViewPort = true;
myWebView.settings.databaseEnabled = true;
myWebView.settings.cacheMode = WebSettings.LOAD_NO_CACHE;
// android os versin 5.0 이상
myWebView.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW;
// webView LayerType 설정
myWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
// https 에서 이미지가 표시 안되는 이슈 처리
if (Build.VERSION.SDK_INT >= Build.VERSION.CODES.LOLLIPOP) {
mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
}
Copy /* 이미지 전송을 위한 처리 */
val chromeClient = object : WebChromeClient() {
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: valueCallback<Array<Uri>>?,
fileChooserParams: FileChooserParams?
): Boolean {
/*
* 이곳에 카메라 호출 및 갤러리 호출 작성
* filePathCallback.onReceiveValue(arrayOf(Uri)) 호출
* Uri = 디바이스 로컬 이미지 파일 Uri 값
* filePathCallback 은 재사용을 위해 반드시 onReceiveValue 호출하여야 함.
* file 선택 없을 시 onReceiveValue(null)로 처리
*/
return true;
}
}
웹 클라이언트에서 카카오톡 및 네이버톡톡 호출시 window.open() 을 사용하기 때문에 안드로이드 WebViewClient 설정 확인이 필요합니다.
만약 WebViewClient 설정이 자사 앱내에서 사용되어야한다면 따로 분기 처리하셔서 개발하셔야합니다.
Copy // Java
webView.setWebViewClient(new WebViewClient()); // 삭제
Copy // Kotlin
webView.webViewClient = WebViewClient() // 삭제
Copy let preferences = WKPreferences()
preferences.javaScriptCanOpenWindowsAutomatically = true
Copy let configuration = WKWebViewConfiguration()
configuration.preferences = preferences
configuration.processPool = WKProcessPool()
Copy extension ViewController: WKUIDelegate, WKNavigationDelegate {
self.wkWebView.translatesAutoresizingMaskIntoConstraints = false
self.wkWebView.uiDelegate = self
self.wkWebView.navigationDelegate = self
}
Copy func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let requestUrl = navigationAction.request
let requestUrlString = requestUrl.url!.absoluteString
print("load url : \(requestUrlString)")
/* (target="_blank" 동작 코드 (사파리 호출) */
if (navigationAction.targetFrame == nil) {
UIApplication.shared.open(requestUrl.url!, options: [:], completionHandler: nil)
decisionHandler(WKNavigationActionPolicy.cancel)
return
} else {
/* 카카오톡 연동 */
if (requestUrlString.contains("https://bizmessage.kakao.com/chat/mo/")) {
/* 웹브라우저 (사파리) 호출 */
UIApplication.shared.open(requestUrl.url!, options: [:], completionHandler: nil)
decisionHandler(WKNavigationActionPolicy.cancel)
return
}
decisionHandler(WKNavigationActionPolicy.allow)
}
}