꺼지지 않는 앱 — WebView 렌더러 크래시 복구와 Chrome 이 대신 해 주던 일들
렌더러가 죽은 WebView 를 살려 냈더니, 살아난 WebView 가 같은 페이지를 열고 또 죽었다. TWA 시절 Chrome 이 조용히 처리하던 크래시, 인증서 오류, 상태바, 뒤로가기, 쿠키를 앱이 하나씩 떠안게 된 이야기이자 연재의 마지막 편이다.
애드소프트 기술블로그
애드소프트 박재호입니다. IIS·ASP.NET 웹 서비스와 메일서버를 직접 운영하고, Unity 게임과 데스크톱 앱을 만들며 겪은 문제와 해결 과정을 기록합니다.
렌더러가 죽은 WebView 를 살려 냈더니, 살아난 WebView 가 같은 페이지를 열고 또 죽었다. TWA 시절 Chrome 이 조용히 처리하던 크래시, 인증서 오류, 상태바, 뒤로가기, 쿠키를 앱이 하나씩 떠안게 된 이야기이자 연재의 마지막 편이다.
WebView 로 옮긴 A/S 관리 앱에서 '푸시 알림 받기'를 켜도 아무 일도 일어나지 않았다. 브라우저가 대신 해 주던 웹 푸시가 WebView 에는 없었다. FCM 과 JS 브리지로 웹과 앱 사이에 다리를 놓고 나서야, 그 다리가 내가 부르지 않은 프레임에까지 놓여 있다는 걸 알았다.
A/S 관리 앱에서 엑셀 내보내기 버튼을 눌렀다. 오류도, 알림도, 파일도 없었다. 브라우저에서는 멀쩡히 내려받던 파일이 WebView 안에서는 갈 곳을 잃고 있었고, 그 길을 내다 보니 새 창 링크와 동영상 전체 화면까지 손보게 됐다.
WebView 에 주소만 넣고 띄운 앱에서 사진 올리기를 누르면 아무 일도 일어나지 않는다. TWA 시절에는 Chrome 이 말없이 해 주던 일이었다. 링크를 누가 열지, 파일 선택 창과 카메라를 누가 띄울지, 위치를 누가 물을지 하나씩 앱이 떠맡은 이야기다.
앱은 멀쩡했다. 그런데 Play 비공개 테스트가 TWA 로 만든 앱의 접수를 멈췄다. Chrome 이 대신 그려 주던 앱을 WebView 로 다시 지으면서, 같은 Play 앱으로 업데이트되게 하려고 바꾸지 않은 이름들과 Chrome 이 말없이 해 주던 일들을 정리했다.
Play 검토자는 내 앱을 처음 보는 사람이고, 빈 화면을 보면 기능이 없다고 판단한다. 그래서 검토자가 쓸 계정에 레시피부터 채워 넣었다. 웹 서비스를 스토어에 올리고 나니 도메인 증명, 정책 페이지, 간편가입, 앱 푸시, 배포 자동화까지 '그 바깥'의 일이 줄줄이 따라왔다.
서버에서는 고쳤고 PC 에서도 고쳐졌는데, 폰에서는 호박 수프 카드에 여전히 카야 토스트 그림이 붙어 있었다. 범인은 오프라인을 위해 넣은 서비스 워커였고, 그 서비스 워커를 갱신하려고 만든 장치가 정작 폰에만 닿지 않고 있었다.
기능을 붙이는 동안 한 번도 의심하지 않은 코드가 있었다. 사진 경로 하나, 레시피 번호 하나를 화면이 보내는 대로 믿고 있었다. 쓰는 사람 대신 노리는 사람의 눈으로 처음 서비스를 다시 읽었더니 열한 가지가 나왔다.
토스트 사진 한 장이 3000x4000, 3.3MB 였다. 레시피 상세에서도, 메뉴 썸네일에서도 그 3.3MB 를 통째로 내려받고 있었다. 사진을 줄이는 건 금방이었는데, 그 사진이 정말 사진인지 묻는 일과 라이브러리를 고르는 일이 훨씬 길었다.
즐겨찾기 100점, 한 번 만들 때마다 1점. 메뉴 고르는 창의 정렬 한 줄에서 시작한 추천은 홈 화면의 오늘의 추천, 비슷한 레시피, 제철 재료를 섞은 이달의 추천까지 자랐다. 그리고 그 추천들이 화면을 열 때마다 레시피 전체를 읽고 있었다.