[pitchpicklive] 푸시 진입 시 WebView 중첩 이슈

[pitchpicklive] 푸시 진입 시 WebView 중첩 이슈

현상

사용자가 앱을 이미 열어둔 상태에서 푸시 알림을 탭하면 기존 WebView 위에 새 WebView가 쌓입니다. 새로 열린 화면을 닫으면 이전 화면이 그대로 남아있어 앱이 중복으로 열린 것처럼 느껴집니다.

재현 순서

  1. 미니앱 진입 (pitchpicklive)
  2. 토스 홈으로 이동 (미니앱은 백그라운드)
  3. 푸시 알림 → 탭 → 앱 재진입
  4. 뒤로가기/닫기 → 이전 앱 화면이 아래 남아있음

임팩트 (실측 데이터)

  • Sentry 실데이터에서 동일 유저 기기의 webview.boot_count 증가 패턴 확인
    • 일부 유저 11분 내 1 → 10 (client sampling 0.1 반영 시 실제 ~100회 추정)
    • 최대 관측값 19
  • 매 부팅마다 webview.session UUID가 전부 상이 → WebView 재사용 없이 신규 생성 확정
  • WebView 인스턴스당 추정 100MB 이상 → 메모리 누적으로 Toss 앱 전체 OS 킬 우려
  • 2026-04-20 대규모 런칭 예정, 푸시 캠페인 트래픽 집중 시 체감 심화 예상

부수 증상

  • 이슈: JAVASCRIPT-REACT-3X
  • 에러: TypeError: undefined is not an object (evaluating 'window.webkit.messageHandlers')
  • 환경: iOS / WKWebView
  • 추정 원인: 새 WebView 생성으로 기존 WebView의 네이티브 브릿지가 무효화되면서 발생

앱단 시도 및 한계

  • visibilitychange 가드로 비활성 WebView의 폴링/분석 호출 중단 (진행 중)
  • Supabase 세션을 Toss Storage로 이관 검토 중 (WebView 간 localStorage 격리 추정 대응)
  • 근본 원인이 WebView 중첩 자체이므로 앱단 완화에 한계

관련 이전 문의

  • 기존 WebView 위에 새 WebView가 쌓입니다
  • graniteEvent.addEventListener(“backEvent”) 해제 후 네이티브 기본 동작(종료 얼럿) 미복원

질문

  1. 동일 앱 스킴 재진입 시 기존 WebView로 라우팅하는 옵션이 있습니까?
  2. WebView 스택 깊이 제한 또는 LRU 자동 정리 기능이 있습니까?
  3. 앱 코드에서 자신의 WebView를 종료할 수 있는 API가 있습니까?
  4. 푸시 페이로드에 “reuse-if-exists” 같은 플래그 지정이 가능합니까?
  5. 비활성 WebView 감지 API (document.hidden 외) 가 있습니까?

에스컬레이션

필요 시 기술 담당자와 직접 연결 부탁드립니다.


appName: pitchpicklive

누군가 대답을 좀 해주시면.,..

안녕하세요 :slight_smile:
죄송해요, 답변이 많이 늦었습니다.

현재 동일한 앱 스킴이 다시 열렸을 때 기존 WebView로 라우팅하는 옵션은 제공하고 있지 않으며, 이전 WebView 레이어를 정리하는 기능도 별도로 지원하지 않고 있습니다.
또한 비활성 상태의 WebView를 감지하는 API 역시 제공하고 있지 않습니다.

webview 스택 깊이 제한은 별도로 없으며, LRU는 백그라운드 스택에서 OS 라이프사이클에 의해 GC 처리 됩니다.

WebView를 종료해야 하는 경우에는 closeView() API를 사용하실 수 있습니다.