6. 모바일 웹뷰 설정

HappyTalk Developer Center / 채팅 버튼 연동 (SDK) / 6. 모바일 웹뷰 설정
메뉴
공지사항
메시지 포맷
Biz API
해피톡
카카오 상담톡 웹훅
Open API
채팅 버튼 연동 (SDK)
목차
웹뷰 설정 코드를 확인해주세요.

Android

샘플 프로젝트 환경 (샘플코드 다운로드)
AndroidManifest.xml에서 권한추가를 아래와 같이 설정해주세요.
<!-- AndroidManifest.xml 인터넷 사용권한 추가 --> <manifest ...> <uses-permission android:name="android.permission.INTERNET"/> </manifest>
XML
복사
웹뷰 필수 설정값을 아래와 같이 설정해주세요.

자바 필수 웹뷰 설정값

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);
Java
복사

코틀린 필수 웹뷰 설정값

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 }
Kotlin
복사
안드로이드 갤러리 설정 가이드는 아래를 꼭 참고해주세요.
Android WebView에서 해피톡 웹채팅 v2 사진 요청시 처리
WebChromeClient의 onShowFileChooser() 메소드 내에서 파일 선택 처리
filePathCallback.onReceiveValue(arrayOf(Uri)) 값 호출
위 URI 값은 디바이스 로컬 이미지 파일 Uri 값
/* 이미지 전송을 위한 처리 */ 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; } }
Java
복사
웹 클라이언트에서 카카오톡 및 네이버톡톡 호출시 window.open() 을 사용하기 때문에 안드로이드 WebViewClient 설정 확인이 필요합니다.만약 WebViewClient 설정이 자사 앱내에서 사용되어야한다면 따로 분기 처리하셔서 개발하셔야합니다.
// Java webView.setWebViewClient(new WebViewClient()); // 삭제 // kotlin webView.webViewClient = WebViewClient() // 삭제
Java
복사

iOS

샘플 프로젝트 환경 (샘플코드 다운로드)
Xcode 13.4.1
IOS Deployment Target 13.0
WKPreferences 세팅
javaScriptCanOpenWindowsAutomatically = true
let preferences = WKPreferences() preferences.javaScriptCanOpenWindowsAutomatically = true
Swift
복사
WKWebViewConfiguration 세팅
preferences = WKPreferences 세팅값 적용
processPool = WKProcessPool()
let configuration = WKWebViewConfiguration() configuration.preferences = preferences configuration.processPool = WKProcessPool()
Swift
복사
WKWebView 세팅
WKWebView Storyboard 세팅 (Default)
translateAutoresizingMaskIntoConstraints = false
UIDelegate
NavigationDelegate
extension ViewController: WKUIDelegate, WKNavigationDelegate { self.wkWebView.translatesAutoresizingMaskIntoConstraints = false self.wkWebView.uiDelegate = self self.wkWebView.navigationDelegate = self }
Swift
복사
카메라, 사진앨범 권한 요청 Description 추가
프로젝트 내 info.plist 추가
Information Property List 내 추가
Privacy - Camera Usage Description 추가
Privacy - Photo Library Usage Description 추가
카카오톡 채널 연동
WKUIDelegate, WKNavigationDelegate 추가
https://bizmessage.kakao.com/chat/mo/ 해당 페이지 load 시 웹브라우저 호출
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: { result in if (result) { /* 웹브라우저 호출 이후 처리 */ } }) decisionHandler(WKNavigationActionPolicy.cancel) return } decisionHandler(WKNavigationActionPolicy.allow) } }
Swift
복사

리액트 네이티브

패키지 추가

yarn 사용
$ yarn add react-native-webview
JavaScript
복사
npm 사용
$ npm install --save react-native-webview
JavaScript
복사

Link native dependencies

$ react-native link react-native-webview
JavaScript
복사

iOS:

CocoaPods을 사용하는 경우 ios 디렉토리에서 실행해주세요.
$ pod install
JavaScript
복사

react-native-webview 속성 설정

<WebView source={{ uri }} // 웹채팅창 URL // 웹뷰 필수 속성 javaScriptEnabled javaScriptCanOpenWindowsAutomatically domStorageEnabled cacheMode='LOAD_NO_CACHE' />
JavaScript
복사
카메라/앨범 사용해 업로드 하려면 권한 설정이 필요합니다.

플러터

패키지 추가

flutter 사용
$ flutter pub add webview_flutter
JavaScript
복사
pubspec.yaml에 추가
dependencies: webview_flutter: ^3.0.4
JavaScript
복사

webview_flutter 추가

import 'package:webview_flutter/webview_flutter.dart';
Dart
복사
Widget build(BuildContext context) { return const WebView( initialUrl: url, // 웹채팅창 URL javascriptMode: JavascriptMode.unrestricted, // javascript 사용 설정 ); } // webview_flutter에는 웹뷰 필수 속성이 기본으로 추가되어 있습니다.
Dart
복사
카메라/앨범 사용해 업로드 하려면 권한 설정이 필요하고 안드로이드는 fileChooser의 구현이 필요합니다.