SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
웹뷰 기반의 하이브리드 앱 개발
작성자: 신동길
소속팀/ 상위부서 : 모바일 클라이언트 개발랩
공개용
ⓒ NAVER Corp.
1. 개발시 많이 받는 질문들?
2. WebView 기반의 하이브리드 앱 구조
3. WebView를 사용하기 위한 구조
4. WebView의 설정
5. WebView Trouble Shooting 사례
6. Web Debugging
7. Chromium WebView와 이슈들
8. Q&A
일반
4 / D2 개발자 세미나
Example of Hybrid App
순수 네이티브 앱은 거의 없다
WebView WebView
일반
5 / D2 개발자 세미나
개발자들에게 받는 다양한 웹뷰 이슈(질문)들
네이버앱은 잘 되는데
• 앱이 BG로 갔는데 동영상이 계속 재생되요?
• 웹이 느리고 하얗게 되네요? 캐시를 지워야 되나요?
• 웹에서 왜 파일 첨부(업로드)가 안되죠?
• 풀스크린 동영상이 안되요?
• PC화면으로 볼 때 전체 화면이 안되네요?
• 구글 플레이 링크랑 전화번호 링크가 동작을 안해요?
• 킷캣을 적용했더니 웹뷰가 죽어요?
• 웹뷰를 띄우고 나면 메모리 사용이 너무 많아져요?
• 사진을 여러장 보고 나면 처음으로 가요?
• 다운로드 푸시가 다르네요?
• 상단 타이틀 바는 어떻게 스크롤해요?
• 모바일 페이지인데 스크롤 바가 생겨요?
• 로그인 쿠키가 셋팅이 안될 때가 있어요?
• 앱 타이틀 바를 스크롤하고 싶은데요?
• 파일 첨부가 안 되요?
• 캐시를 다 지우고 싶은데요?
• 쿠키를 셋팅하고 앱을 다시 실행하면 로그인 풀려요?
• 웹에서 앱 설치 여부를 확인할 수 없나요?
• 웹에서 폰의 주소록을 가져올 수가 없나요?
• 네트워크 상태를 웹에서 정확히 알 수가 없나요?
• 다른 앱에서 바로 네이버 검색을 띄우고 싶은데?
• 웹에서 위치 정보에를 못받아요?
일반
6 / D2 개발자 세미나
일반적인 Web-App Hybrid 앱의 구조
InApp
WebView
DataBinder
Framework
DataConnectors
DbManager
Pure App GUI
SeachCookie
Manager
Push Module
InAppBrowser
Download
Service
GUI
Data Core
WebView Framework
InAppWebViewFragement
Login
Service Module
InApp
Purchase
Section 1
WebView 의 기본과 사용방법
일반
8 / D2 개발자 세미나
WebView 와 관련 객체
WebView
WebChromeClient
WebViewClient
DownloadListenerCookieManager
WebCore
InAppWebViewFragment
일반
9 / D2 개발자 세미나
Webkit 관련 중요 객체
클래스 설명
WebView 웹 페이지를 로드하기 위한 메인 객체이며 View이다,
WebViViewCLient 페이지 로드시에 수행 되는 과정을 위한 Callback 함수들이 정의 되어 있다. 주
로 HTTP Session 의 동작과 관련된 내용이다.
WebChromeClient 페이지 내에서 일어나는 동작에 관련된 Callback 함수를 정의한다. 주로
JavaScript와 HTML%에 관련된 Callback을 정의한다.
DownloadListener 파일을 다운로드 해야 할 경우 다운로드를 위한 Callback 수를 정의한다.
FindListener 페이지 내에서 찾기 기능을 사용할 때 사용한다.
PictureListerner 화면 캡처하고자 할때 결과를 받기 사용한다.
CookieManager
CookieSyncManager
쿠키를 읽고,쓰고, 동기화를 위한 관리 객체이다.
일반
10 / D2 개발자 세미나
WebView의 초기화
WebView Listener초기화
일반
11 / D2 개발자 세미나
WebView 기본 설정 (Settings)
일반
12 / D2 개발자 세미나
HTML5 Storage, AppCache ,Web DB 지원설정
Uncaught TypeError: Object [object
DOMWindow] has no method 'openDatabase'
"SECURITY_ERR: DOM Exception 18"
WebViewSettings
WebChromeClient
일반
13 / D2 개발자 세미나
WebView 의 동작시 함수 호출 Flow
WebChromeClientWebViewClient DownloadListenerWebView
onProgressChanaged()
onReceivedTitle()
shouldInterceptRequest()
onPageStarted()
onPageFinished()
shouldOverrideUrlLoading
onReceivedError()
doUpdateVisitedHistory
onDownloadStart()
onCreateWindow
onShowCustomView
openFileChooser
loadUrl()
onLoadResource()
Click a link onPageStarted()
일반
14 / D2 개발자 세미나
WebView Custom 라이브러리의 필요성
요구사항
• 많은 설정이 필요하고, 기본적인 설정은 반드시 해야 함
• Activity Cycle에 따른 제어가 필요함
• 서비스 URI에 따라 예외적인 처리를 해 주어야 하고, Well-Known URI 처리도 필요
• OS 버전에 따른 파편화 대응 필요
InAppWebView 라이브러리
• Fragment 기반으로 WebViewTimer 및 Cycle 제어
• WebView, WebViewClient, WebChromeClient 의 선언과 설정
• Listener 의 등록/해지
• PlugIn 으로 URI 처리
• OS 버전별 예외처리
Section 2
WebView
문제 사례와 해결 방법
일반
16 / D2 개발자 세미나
WebView LifeCycle 제어
사례 1.
단말에 따라서 웹 페이지가 너무 느리게 로딩이 되요. 어떤 때는 하얗게 되요?
캐시가 문제인가요? 아니면 네트워크 설정에 문제가 있나요?
사례2.
웹뷰를 쓰고 나면 메모리가 20MByte 이상 계속 증가해요. 그러다가 죽어요.
페이지가 무거워서 그런건가요? 아니면 캐시가 남아 있나요?
사례3.
홈 키를 눌러 앱을 백그라운드로 보냈는데 동영상이 계속 Play 되고 있어요?
앱이 실행 중이 아닌데 프로세스를 쓰고 계속 배터리를 먹어요.
일반
17 / D2 개발자 세미나
WebView Timer 제어 & Cycle 제어
함수 설명
resumeTimers() Resumes all layout, parsing, and JavaScript timers for all WebViews.
This is a global requests, not restricted to just this WebView. This can be useful
if the application has been paused.
pauseTimers () Pauses all layout, parsing, and JavaScript timers for all WebViews. This is a
global requests, not restricted to just this WebView. This can be useful if the
application has been paused.
onResume() Resumes a WebView after a previous call to onPause().
onPause() Pauses any extra processing associated with this WebView and its associated
DOM, plugins, JavaScript etc. For example, if this WebView is taken offscreen,
this could be called to reduce unnecessary CPU or network traffic. When this
WebView is again "active", call onResume(). Note that this differs from
pauseTimers(), which affects all WebViews.
destroy() Destroys the internal state of this WebView. This method should be called after
this WebView has been removed from the view system. No other methods may
be called on this WebView after destroy
일반
18 / D2 개발자 세미나
WebView Timer 제어 & Cycle 제어 Example
WebView Timer 제어
-Global Timer이므로 앱 내의 모든 웹뷰에 영향을 끼칩니다.
-앱이 BG에 있거나 WebView가 보이지 않는 경우
pauseTimers()를 호출해야 WebView는 비활성 상태가 됨
-개별 WebView를 포함하는 Activity나 Fragment에서 제
어가 가능합니다(예제코드)
-개별 WebView에서 제어하지 않고 앱의 Active/Dormant
를 체크하고 여기에서 제어하는 것도 가능합니다.
boolean mIsTimerPaused = true;
void onResume() {
if (mIsTimerPaused == false) {
mWebView.resumeTimers();
mWebView.onResume();
mIsTimerPaused = false;
}
}
void onPause() {
if (mIsTimerPaused == true) {
mWebView.pauseTimers();
mWebView.onPause();
mIsTimerPaused = true;
}
}
void onDestroy() {
mWebView.destroy ();
}
일반
19 / D2 개발자 세미나
동영상 재생
아래의 2가지는 하드웨어 가속이 설정되어 있어야만 정상 동작한다.
- 동영상 Poster 와 동영상 재생
- Flash 컨탠츠 재생
Manifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:name="com.nhn.android.search.SearchApplication"
android:theme="@style/Theme.NoShadow" android:hardwareAccelerated="true"
android:largeHeap="true">
전체 기능을 사용하지 않는 제한적인 WebView 사용에서는 하드웨어 가속을 Off 가능하다.
사례.
- 웹 내의 동영상 이미지가 안보여요. 동영상 재생하는데 깨져요.
- 전체 화면이 앙되요 ㅠㅠ
일반
20 / D2 개발자 세미나
동영상 재생 (2)
풀 스크린 동영상을 위해서는 onShowCustomView()와 onHideCustomView()을 구현한다.
onShowCustomView() 에서는 표시할 동영상 View를 인자로 전달 -> 적절한 Layout에 넣는다.
종료시 CustomViewCallback. .onCustomViewHidden() 호출 필요
일반
21 / D2 개발자 세미나
클링 링크 처리(1)
shouldOverrideLoadingUrl(String url)
• a tag, window.location,, window.redirect, window.open 등 웹에서새 URL로 페이지를 로딩하
고자 할 때 호출되는 Callback 함수.
• http가 아닌 uri Scheme에 대한 처리도 여기에서 해야 한다.
• 꼭 해야 하는것
• Well-Know URI, martket, intent , tel, sms, mms, mailto, ftp, 맞는 Intent Action과
return true; url 로드 않고 완료
return false; 동일한 창에 url 로
return super.shouldOverrideLoadingUrl() 새로운 브라우저를 열어 로딩
사례.
- 마켓으로 이동을 안해요? 전화 번호 링크도 안 되는데요?
- 로그인 링크가 들어오면 웹에서 처리하지 않고, 앱에서 처리(앱 로그인 창) 하고 싶어요?
일반
22 / D2 개발자 세미나
클링 링크 처리(2)
웹뷰에서 로드하지 못하는 uri는
Intent호출
구글 play store URL은 google play앱을 띄워 주도록 예외처리
return false;
VS
loadUrl(); return true;
일반
23 / D2 개발자 세미나
웹과 앱의 통신
WebSetting의 addJavaScriptInterface() 함수로 Web에서 호출할 수 있는 Custom Java Script 객체
추가
addJavaScriptInterface(Object object,String name) 의 형식이며, 웹에서는 window.name.함수이
름() 의 형태로 호출 할 수 있다.
앱에서 웹페이지 내의 함수를 호출할 때는 WebView. loadUrl(“javascript:jsfunc(1234) ”) ; 형태 호출
한다.
사례
- 웹에서 단말의 주소록을 가져오고 싶는데 가능하한가요??
- 웹에서 링크를 클릭하면 앱에서 사진을 찍어서 사진 서버로 올리고, 결과를 웹으로 알려줄 수 없나요?
일반
24 / D2 개발자 세미나
웹에서 앱 설치 여부 체크 - Web-App Communication
public class JavaScriptFeature {
Context mContext;
public JavaScriptFeature(Context context) {
mContext = context;
}
@JavascriptInterface
public boolean isPkgInstalled(String pkgName) {
try {
PackageInfo info = mContext.getPackageManager().getPackageInfo(pkgName, 0);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
}
사례
- 웹에서 앱 설치 여부를 알고 싶어요?
Call Script(HTML)
boolean isIstalled = window.android.isPkgIstalled("com.kakao.kakaotalk");
Inject Inteface(App)
mWebView.addJavaScriptInterace(new JavaScrtiptFeature(getActivity()),"android");
일반
25 / D2 개발자 세미나
Web-App Communication – Code Example(주소록 pickUp)
사례
- 웹에서 단말의 주소록을 가져오고 싶는데 가능하한가요??
일반
26 / D2 개발자 세미나
Web-App Communication – Code Example(주소록 pickUp)
Web
Page
WebView Android
System
widow,android.pickContact()
startActivity
Contact List
onActivityResult()
mWebView.loadUrl(“javascript:onPickupContact”)
getPickedContact()
일반
27 / D2 개발자 세미나
Web-App Communication – Code Example(주소록 pickUp)
일반
28 / D2 개발자 세미나
웹-앱 인터페이스- -파일 첨부(1)
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" >
<input type="submit" value="Upload">
</form>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="*/*" >
<input type="submit" value="Upload">
</form>
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" accept="image/*" capture >
<input type="submit" value="Upload">
</form>
<a src=“”d2app://uploadFile” > 파일 업로드</a>
사례
- 웹에서 파일 첨부를 하고 싶은데요?
일반
29 / D2 개발자 세미나
웹-앱 인터페이스-파일 첨부(2)
파일첨부 그림 WebChromeClient 의 void openFileChooser()를 Override한다.
해당 함수는 @Hide이므로 그냥 보이지는 않습니다. OS 버전에 따라 다른 함수가 불리게 되므로 3개의 함수를 모두 구현
일반
30 / D2 개발자 세미나
앱시작시 크래시 - OS 2.3 이하에서 SQLiteException 발생 문제
WebView 내에서 사용하는 DB 접근에 문제가 발생하는 경우가 많음.
웹뷰를 생성하기 전에 validateWebView()로 DB 확인
NO_CACHE 와 AppCache 미 사용. 예제와 같이 DB 에 대한 확인 절차가 버그 처리에 도움이 됨.
Section 3
디버깅과 KITKAT 웹뷰 이슈
일반
32 / D2 개발자 세미나
Web에서 웹 페이지 디버깅
KITKAT의 Chrome Debugging 기능
WebView. setWebContentsDebuggingEnabled (true)을 설정하면 크롬브라우저와 연결하여 페이지의 로딩 쿠키, DOM
Storage등 페이지 관련 정보를 모두 볼 수 있다.
WebViewClient.onConsoleMessage()
웹페이지에서 스크립트 에러 발생시에 Callback
AddJavaScriptInterface를 이용한 방법
- DOM 객체에 HTML Script를 복사한다.
- onPageFinished에서 mWebView.loadUrl(SCRIPT_GETTING_HTML); 호출
일반
33 / D2 개발자 세미나
ADB Plugin을 통한 디버깅(KK)
1. 웹뷰에 setWebContentsDebuggingEnabled(true);
2. PC 의 Chrome Web Browser에 ADB Plugin 추가
3, Device 연결(usb 디버깅 설정됨)
일반
34 / D2 개발자 세미나
2.3 KIKAT and Chromium WebView
KIKAT에서는 기존의 Webkit이 아니라 Chromium WebView로 WebView
Core를 변경
Multi-Process 지원이 가능하며
HTML5 의 WebAudio, WebGL 등 대부분의 기능을 지원
BUT
-안정성에 문제 발생
-기존의 기능이 지원되지 않는 문제
- 수많은 버그들
일반
35 / D2 개발자 세미나
KITKAT WebView ISSUES and Workaround
문제 설명 4.4.2 4.4.3 4.4.4 L 우회방법
Child Webview
addJavaScript
shouldOverrideLoadi
ng
setUserAgent
window.open 또는 target 형태로
띄워진 child webview상에서
shouldOverridedLoading callback
이 동작을 하지 않아
여러 scheme 등 앱단에서 처리 루틴
을 타지 못함.
X X X X 처리방법 없음.
setUserAgent는loadUrl()호출후 적
용됨
Webview canvas
crash
js alert dialog Crash
content가 많은 page에서 webview
canvas lock발생되는 현상
X X X X webview detach 수행으로 일부 크
래시 회피
File Upload webview 상에서 file upload지원 기
능이 사라짐.
X O O O 지원안될 경우, 앱단에서 photo
upload service를 통하여 지원
Flash지원 webview상에서 Flash 지원 X X X X 처리방법 없음.
Webview scroll webview상에서 page scroll 시도시
최하단까지 scroll되지 않는 case 발
생
X X O O issue발생되는 case에선, page의
scale값이 1 미만인지 확인후 1미만
이 되지 않도록 웹page 설정
chrome 33이상 버전부터 이슈해결
된 것으로 보임.
A tag 동영상 Player
Picker
동영상 링크 선택시 player선택창이
뜨지 않고
slide 창이 발생되면서 내부 play로
재생
X X X X mimeType을 확인하여 video인 경
우에 startActivity 시켜줌
Q & A
일반
37 / D2 개발자 세미나
1. Reflection : 웹뷰 상단에 레이아웃을 넣고 웹과 같이 스크롤하고 싶은데요?
SetEmeddedTitleBar
일반
38 / D2 개발자 세미나
Web-App Communication
addJavaScriptInterface()
appcaller
isPkgInstalled(String )window.appcaller.isPkgInstalled()
loadUrl(“javascript:checkPackge()”);
window.location = napp://checkPackageInstall?id=com.nhn.nmap

Contenu connexe

Tendances

이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
devCAT Studio, NEXON
 

Tendances (20)

Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
오딘: 발할라 라이징 MMORPG의 성능 최적화 사례 공유 [카카오게임즈 - 레벨 300] - 발표자: 김문권, 팀장, 라이온하트 스튜디오...
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
Secrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on KubernetesSecrets of Performance Tuning Java on Kubernetes
Secrets of Performance Tuning Java on Kubernetes
 
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
NDC14 범용 게임 서버 프레임워크 디자인 및 테크닉
 
Next-generation MMORPG service architecture
Next-generation MMORPG service architectureNext-generation MMORPG service architecture
Next-generation MMORPG service architecture
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
[IMQA] 빠른 웹페이지 만들기 - 당신의 웹페이지는 몇 점인가요?
[IMQA] 빠른 웹페이지 만들기 - 당신의 웹페이지는 몇 점인가요?[IMQA] 빠른 웹페이지 만들기 - 당신의 웹페이지는 몇 점인가요?
[IMQA] 빠른 웹페이지 만들기 - 당신의 웹페이지는 몇 점인가요?
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기 [122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
[122]책에서는 맛볼 수 없는 HTML5 Canvas 이야기
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 

En vedette

JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
NAVER D2
 
데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님
NAVER D2
 

En vedette (20)

JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
 
[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님텀 프로젝트에서 제품 프로젝트로 - 성준영님
텀 프로젝트에서 제품 프로젝트로 - 성준영님
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
 
데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님
 
Papago/N2MT 개발이야기
Papago/N2MT 개발이야기Papago/N2MT 개발이야기
Papago/N2MT 개발이야기
 
[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선
 
Container & kubernetes
Container & kubernetesContainer & kubernetes
Container & kubernetes
 
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
 
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
 
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes[D2 COMMUNITY] Open Container Seoul Meetup -  마이크로 서비스 아키텍쳐와 Docker kubernetes
[D2 COMMUNITY] Open Container Seoul Meetup - 마이크로 서비스 아키텍쳐와 Docker kubernetes
 
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
 
Docker d2 박승환
Docker d2 박승환Docker d2 박승환
Docker d2 박승환
 
blue-green deployment with docker containers
blue-green deployment with docker containersblue-green deployment with docker containers
blue-green deployment with docker containers
 
[KAIST - RUN] 프로그래밍 경진대회 문제
[KAIST - RUN] 프로그래밍 경진대회 문제[KAIST - RUN] 프로그래밍 경진대회 문제
[KAIST - RUN] 프로그래밍 경진대회 문제
 

Similaire à [D2 오픈세미나]3.web view hybridapp

캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
Daum DNA
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발
지수 윤
 
KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅
흥배 최
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
Jae Sung Park
 

Similaire à [D2 오픈세미나]3.web view hybridapp (20)

Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
PWA 파헤치기
PWA 파헤치기PWA 파헤치기
PWA 파헤치기
 
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
Angularjs, ionic, cordova 기반 syrup store app 개발 사례 공유
 
Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기Meteor React Tutorial 따라하기
Meteor React Tutorial 따라하기
 
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
조은 - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
 
구글앱엔진 스터디
구글앱엔진 스터디구글앱엔진 스터디
구글앱엔진 스터디
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
 
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
캠프앱 개발 사례를 통해 본 하이브리드앱 어디까지 | Devon 2012
 
공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반공간정보아카데미 - Day1 오픈소스개발 일반
공간정보아카데미 - Day1 오픈소스개발 일반
 
원모먼트 Vue js 적용기
원모먼트 Vue js 적용기원모먼트 Vue js 적용기
원모먼트 Vue js 적용기
 
Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발Jenkins를 활용한 javascript 개발
Jenkins를 활용한 javascript 개발
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화[2018] 프런트엔드 성능 최적화
[2018] 프런트엔드 성능 최적화
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅KGC10 - Visual C++10과 디버깅
KGC10 - Visual C++10과 디버깅
 
Vue 뽀개기 1장 환경설정 및 spa설정
Vue 뽀개기 1장 환경설정 및 spa설정Vue 뽀개기 1장 환경설정 및 spa설정
Vue 뽀개기 1장 환경설정 및 spa설정
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
Internship backend
Internship backendInternship backend
Internship backend
 

Plus de NAVER D2

Plus de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[D2 오픈세미나]3.web view hybridapp

  • 1. 웹뷰 기반의 하이브리드 앱 개발 작성자: 신동길 소속팀/ 상위부서 : 모바일 클라이언트 개발랩 공개용 ⓒ NAVER Corp.
  • 2. 1. 개발시 많이 받는 질문들? 2. WebView 기반의 하이브리드 앱 구조 3. WebView를 사용하기 위한 구조 4. WebView의 설정 5. WebView Trouble Shooting 사례 6. Web Debugging 7. Chromium WebView와 이슈들 8. Q&A
  • 3.
  • 4. 일반 4 / D2 개발자 세미나 Example of Hybrid App 순수 네이티브 앱은 거의 없다 WebView WebView
  • 5. 일반 5 / D2 개발자 세미나 개발자들에게 받는 다양한 웹뷰 이슈(질문)들 네이버앱은 잘 되는데 • 앱이 BG로 갔는데 동영상이 계속 재생되요? • 웹이 느리고 하얗게 되네요? 캐시를 지워야 되나요? • 웹에서 왜 파일 첨부(업로드)가 안되죠? • 풀스크린 동영상이 안되요? • PC화면으로 볼 때 전체 화면이 안되네요? • 구글 플레이 링크랑 전화번호 링크가 동작을 안해요? • 킷캣을 적용했더니 웹뷰가 죽어요? • 웹뷰를 띄우고 나면 메모리 사용이 너무 많아져요? • 사진을 여러장 보고 나면 처음으로 가요? • 다운로드 푸시가 다르네요? • 상단 타이틀 바는 어떻게 스크롤해요? • 모바일 페이지인데 스크롤 바가 생겨요? • 로그인 쿠키가 셋팅이 안될 때가 있어요? • 앱 타이틀 바를 스크롤하고 싶은데요? • 파일 첨부가 안 되요? • 캐시를 다 지우고 싶은데요? • 쿠키를 셋팅하고 앱을 다시 실행하면 로그인 풀려요? • 웹에서 앱 설치 여부를 확인할 수 없나요? • 웹에서 폰의 주소록을 가져올 수가 없나요? • 네트워크 상태를 웹에서 정확히 알 수가 없나요? • 다른 앱에서 바로 네이버 검색을 띄우고 싶은데? • 웹에서 위치 정보에를 못받아요?
  • 6. 일반 6 / D2 개발자 세미나 일반적인 Web-App Hybrid 앱의 구조 InApp WebView DataBinder Framework DataConnectors DbManager Pure App GUI SeachCookie Manager Push Module InAppBrowser Download Service GUI Data Core WebView Framework InAppWebViewFragement Login Service Module InApp Purchase
  • 7. Section 1 WebView 의 기본과 사용방법
  • 8. 일반 8 / D2 개발자 세미나 WebView 와 관련 객체 WebView WebChromeClient WebViewClient DownloadListenerCookieManager WebCore InAppWebViewFragment
  • 9. 일반 9 / D2 개발자 세미나 Webkit 관련 중요 객체 클래스 설명 WebView 웹 페이지를 로드하기 위한 메인 객체이며 View이다, WebViViewCLient 페이지 로드시에 수행 되는 과정을 위한 Callback 함수들이 정의 되어 있다. 주 로 HTTP Session 의 동작과 관련된 내용이다. WebChromeClient 페이지 내에서 일어나는 동작에 관련된 Callback 함수를 정의한다. 주로 JavaScript와 HTML%에 관련된 Callback을 정의한다. DownloadListener 파일을 다운로드 해야 할 경우 다운로드를 위한 Callback 수를 정의한다. FindListener 페이지 내에서 찾기 기능을 사용할 때 사용한다. PictureListerner 화면 캡처하고자 할때 결과를 받기 사용한다. CookieManager CookieSyncManager 쿠키를 읽고,쓰고, 동기화를 위한 관리 객체이다.
  • 10. 일반 10 / D2 개발자 세미나 WebView의 초기화 WebView Listener초기화
  • 11. 일반 11 / D2 개발자 세미나 WebView 기본 설정 (Settings)
  • 12. 일반 12 / D2 개발자 세미나 HTML5 Storage, AppCache ,Web DB 지원설정 Uncaught TypeError: Object [object DOMWindow] has no method 'openDatabase' "SECURITY_ERR: DOM Exception 18" WebViewSettings WebChromeClient
  • 13. 일반 13 / D2 개발자 세미나 WebView 의 동작시 함수 호출 Flow WebChromeClientWebViewClient DownloadListenerWebView onProgressChanaged() onReceivedTitle() shouldInterceptRequest() onPageStarted() onPageFinished() shouldOverrideUrlLoading onReceivedError() doUpdateVisitedHistory onDownloadStart() onCreateWindow onShowCustomView openFileChooser loadUrl() onLoadResource() Click a link onPageStarted()
  • 14. 일반 14 / D2 개발자 세미나 WebView Custom 라이브러리의 필요성 요구사항 • 많은 설정이 필요하고, 기본적인 설정은 반드시 해야 함 • Activity Cycle에 따른 제어가 필요함 • 서비스 URI에 따라 예외적인 처리를 해 주어야 하고, Well-Known URI 처리도 필요 • OS 버전에 따른 파편화 대응 필요 InAppWebView 라이브러리 • Fragment 기반으로 WebViewTimer 및 Cycle 제어 • WebView, WebViewClient, WebChromeClient 의 선언과 설정 • Listener 의 등록/해지 • PlugIn 으로 URI 처리 • OS 버전별 예외처리
  • 16. 일반 16 / D2 개발자 세미나 WebView LifeCycle 제어 사례 1. 단말에 따라서 웹 페이지가 너무 느리게 로딩이 되요. 어떤 때는 하얗게 되요? 캐시가 문제인가요? 아니면 네트워크 설정에 문제가 있나요? 사례2. 웹뷰를 쓰고 나면 메모리가 20MByte 이상 계속 증가해요. 그러다가 죽어요. 페이지가 무거워서 그런건가요? 아니면 캐시가 남아 있나요? 사례3. 홈 키를 눌러 앱을 백그라운드로 보냈는데 동영상이 계속 Play 되고 있어요? 앱이 실행 중이 아닌데 프로세스를 쓰고 계속 배터리를 먹어요.
  • 17. 일반 17 / D2 개발자 세미나 WebView Timer 제어 & Cycle 제어 함수 설명 resumeTimers() Resumes all layout, parsing, and JavaScript timers for all WebViews. This is a global requests, not restricted to just this WebView. This can be useful if the application has been paused. pauseTimers () Pauses all layout, parsing, and JavaScript timers for all WebViews. This is a global requests, not restricted to just this WebView. This can be useful if the application has been paused. onResume() Resumes a WebView after a previous call to onPause(). onPause() Pauses any extra processing associated with this WebView and its associated DOM, plugins, JavaScript etc. For example, if this WebView is taken offscreen, this could be called to reduce unnecessary CPU or network traffic. When this WebView is again "active", call onResume(). Note that this differs from pauseTimers(), which affects all WebViews. destroy() Destroys the internal state of this WebView. This method should be called after this WebView has been removed from the view system. No other methods may be called on this WebView after destroy
  • 18. 일반 18 / D2 개발자 세미나 WebView Timer 제어 & Cycle 제어 Example WebView Timer 제어 -Global Timer이므로 앱 내의 모든 웹뷰에 영향을 끼칩니다. -앱이 BG에 있거나 WebView가 보이지 않는 경우 pauseTimers()를 호출해야 WebView는 비활성 상태가 됨 -개별 WebView를 포함하는 Activity나 Fragment에서 제 어가 가능합니다(예제코드) -개별 WebView에서 제어하지 않고 앱의 Active/Dormant 를 체크하고 여기에서 제어하는 것도 가능합니다. boolean mIsTimerPaused = true; void onResume() { if (mIsTimerPaused == false) { mWebView.resumeTimers(); mWebView.onResume(); mIsTimerPaused = false; } } void onPause() { if (mIsTimerPaused == true) { mWebView.pauseTimers(); mWebView.onPause(); mIsTimerPaused = true; } } void onDestroy() { mWebView.destroy (); }
  • 19. 일반 19 / D2 개발자 세미나 동영상 재생 아래의 2가지는 하드웨어 가속이 설정되어 있어야만 정상 동작한다. - 동영상 Poster 와 동영상 재생 - Flash 컨탠츠 재생 Manifest.xml <application android:icon="@drawable/icon" android:label="@string/app_name" android:name="com.nhn.android.search.SearchApplication" android:theme="@style/Theme.NoShadow" android:hardwareAccelerated="true" android:largeHeap="true"> 전체 기능을 사용하지 않는 제한적인 WebView 사용에서는 하드웨어 가속을 Off 가능하다. 사례. - 웹 내의 동영상 이미지가 안보여요. 동영상 재생하는데 깨져요. - 전체 화면이 앙되요 ㅠㅠ
  • 20. 일반 20 / D2 개발자 세미나 동영상 재생 (2) 풀 스크린 동영상을 위해서는 onShowCustomView()와 onHideCustomView()을 구현한다. onShowCustomView() 에서는 표시할 동영상 View를 인자로 전달 -> 적절한 Layout에 넣는다. 종료시 CustomViewCallback. .onCustomViewHidden() 호출 필요
  • 21. 일반 21 / D2 개발자 세미나 클링 링크 처리(1) shouldOverrideLoadingUrl(String url) • a tag, window.location,, window.redirect, window.open 등 웹에서새 URL로 페이지를 로딩하 고자 할 때 호출되는 Callback 함수. • http가 아닌 uri Scheme에 대한 처리도 여기에서 해야 한다. • 꼭 해야 하는것 • Well-Know URI, martket, intent , tel, sms, mms, mailto, ftp, 맞는 Intent Action과 return true; url 로드 않고 완료 return false; 동일한 창에 url 로 return super.shouldOverrideLoadingUrl() 새로운 브라우저를 열어 로딩 사례. - 마켓으로 이동을 안해요? 전화 번호 링크도 안 되는데요? - 로그인 링크가 들어오면 웹에서 처리하지 않고, 앱에서 처리(앱 로그인 창) 하고 싶어요?
  • 22. 일반 22 / D2 개발자 세미나 클링 링크 처리(2) 웹뷰에서 로드하지 못하는 uri는 Intent호출 구글 play store URL은 google play앱을 띄워 주도록 예외처리 return false; VS loadUrl(); return true;
  • 23. 일반 23 / D2 개발자 세미나 웹과 앱의 통신 WebSetting의 addJavaScriptInterface() 함수로 Web에서 호출할 수 있는 Custom Java Script 객체 추가 addJavaScriptInterface(Object object,String name) 의 형식이며, 웹에서는 window.name.함수이 름() 의 형태로 호출 할 수 있다. 앱에서 웹페이지 내의 함수를 호출할 때는 WebView. loadUrl(“javascript:jsfunc(1234) ”) ; 형태 호출 한다. 사례 - 웹에서 단말의 주소록을 가져오고 싶는데 가능하한가요?? - 웹에서 링크를 클릭하면 앱에서 사진을 찍어서 사진 서버로 올리고, 결과를 웹으로 알려줄 수 없나요?
  • 24. 일반 24 / D2 개발자 세미나 웹에서 앱 설치 여부 체크 - Web-App Communication public class JavaScriptFeature { Context mContext; public JavaScriptFeature(Context context) { mContext = context; } @JavascriptInterface public boolean isPkgInstalled(String pkgName) { try { PackageInfo info = mContext.getPackageManager().getPackageInfo(pkgName, 0); return true; } catch (NameNotFoundException e) { return false; } } } 사례 - 웹에서 앱 설치 여부를 알고 싶어요? Call Script(HTML) boolean isIstalled = window.android.isPkgIstalled("com.kakao.kakaotalk"); Inject Inteface(App) mWebView.addJavaScriptInterace(new JavaScrtiptFeature(getActivity()),"android");
  • 25. 일반 25 / D2 개발자 세미나 Web-App Communication – Code Example(주소록 pickUp) 사례 - 웹에서 단말의 주소록을 가져오고 싶는데 가능하한가요??
  • 26. 일반 26 / D2 개발자 세미나 Web-App Communication – Code Example(주소록 pickUp) Web Page WebView Android System widow,android.pickContact() startActivity Contact List onActivityResult() mWebView.loadUrl(“javascript:onPickupContact”) getPickedContact()
  • 27. 일반 27 / D2 개발자 세미나 Web-App Communication – Code Example(주소록 pickUp)
  • 28. 일반 28 / D2 개발자 세미나 웹-앱 인터페이스- -파일 첨부(1) <form method="post" enctype="multipart/form-data"> <input type="file" name="image" > <input type="submit" value="Upload"> </form> <form method="post" enctype="multipart/form-data"> <input type="file" name="image" accept="*/*" > <input type="submit" value="Upload"> </form> <form method="post" enctype="multipart/form-data"> <input type="file" name="image" accept="image/*" capture > <input type="submit" value="Upload"> </form> <a src=“”d2app://uploadFile” > 파일 업로드</a> 사례 - 웹에서 파일 첨부를 하고 싶은데요?
  • 29. 일반 29 / D2 개발자 세미나 웹-앱 인터페이스-파일 첨부(2) 파일첨부 그림 WebChromeClient 의 void openFileChooser()를 Override한다. 해당 함수는 @Hide이므로 그냥 보이지는 않습니다. OS 버전에 따라 다른 함수가 불리게 되므로 3개의 함수를 모두 구현
  • 30. 일반 30 / D2 개발자 세미나 앱시작시 크래시 - OS 2.3 이하에서 SQLiteException 발생 문제 WebView 내에서 사용하는 DB 접근에 문제가 발생하는 경우가 많음. 웹뷰를 생성하기 전에 validateWebView()로 DB 확인 NO_CACHE 와 AppCache 미 사용. 예제와 같이 DB 에 대한 확인 절차가 버그 처리에 도움이 됨.
  • 32. 일반 32 / D2 개발자 세미나 Web에서 웹 페이지 디버깅 KITKAT의 Chrome Debugging 기능 WebView. setWebContentsDebuggingEnabled (true)을 설정하면 크롬브라우저와 연결하여 페이지의 로딩 쿠키, DOM Storage등 페이지 관련 정보를 모두 볼 수 있다. WebViewClient.onConsoleMessage() 웹페이지에서 스크립트 에러 발생시에 Callback AddJavaScriptInterface를 이용한 방법 - DOM 객체에 HTML Script를 복사한다. - onPageFinished에서 mWebView.loadUrl(SCRIPT_GETTING_HTML); 호출
  • 33. 일반 33 / D2 개발자 세미나 ADB Plugin을 통한 디버깅(KK) 1. 웹뷰에 setWebContentsDebuggingEnabled(true); 2. PC 의 Chrome Web Browser에 ADB Plugin 추가 3, Device 연결(usb 디버깅 설정됨)
  • 34. 일반 34 / D2 개발자 세미나 2.3 KIKAT and Chromium WebView KIKAT에서는 기존의 Webkit이 아니라 Chromium WebView로 WebView Core를 변경 Multi-Process 지원이 가능하며 HTML5 의 WebAudio, WebGL 등 대부분의 기능을 지원 BUT -안정성에 문제 발생 -기존의 기능이 지원되지 않는 문제 - 수많은 버그들
  • 35. 일반 35 / D2 개발자 세미나 KITKAT WebView ISSUES and Workaround 문제 설명 4.4.2 4.4.3 4.4.4 L 우회방법 Child Webview addJavaScript shouldOverrideLoadi ng setUserAgent window.open 또는 target 형태로 띄워진 child webview상에서 shouldOverridedLoading callback 이 동작을 하지 않아 여러 scheme 등 앱단에서 처리 루틴 을 타지 못함. X X X X 처리방법 없음. setUserAgent는loadUrl()호출후 적 용됨 Webview canvas crash js alert dialog Crash content가 많은 page에서 webview canvas lock발생되는 현상 X X X X webview detach 수행으로 일부 크 래시 회피 File Upload webview 상에서 file upload지원 기 능이 사라짐. X O O O 지원안될 경우, 앱단에서 photo upload service를 통하여 지원 Flash지원 webview상에서 Flash 지원 X X X X 처리방법 없음. Webview scroll webview상에서 page scroll 시도시 최하단까지 scroll되지 않는 case 발 생 X X O O issue발생되는 case에선, page의 scale값이 1 미만인지 확인후 1미만 이 되지 않도록 웹page 설정 chrome 33이상 버전부터 이슈해결 된 것으로 보임. A tag 동영상 Player Picker 동영상 링크 선택시 player선택창이 뜨지 않고 slide 창이 발생되면서 내부 play로 재생 X X X X mimeType을 확인하여 video인 경 우에 startActivity 시켜줌
  • 36. Q & A
  • 37. 일반 37 / D2 개발자 세미나 1. Reflection : 웹뷰 상단에 레이아웃을 넣고 웹과 같이 스크롤하고 싶은데요? SetEmeddedTitleBar
  • 38. 일반 38 / D2 개발자 세미나 Web-App Communication addJavaScriptInterface() appcaller isPkgInstalled(String )window.appcaller.isPkgInstalled() loadUrl(“javascript:checkPackge()”); window.location = napp://checkPackageInstall?id=com.nhn.nmap