이 글의 성격은 무엇인가요?
질문 / 문제 해결
내용을 설명해주세요
샌드박스 WebView에서 fetch 응답을 WebAssembly.compileStreaming이 거부하여 Flutter Web 미니앱이 첫 화면에서 멈춥니다
앱: 뚜시푸시 (appName: ttush-push), @apps-in-toss/web-framework 3.5.0
기기: iPhone, iOS 18.7, TossApp 5.278.2
발생 시점: 2026-09-29 저녁(KST)에 확인했습니다.
[증상]
콘솔의 테스트 푸시로 샌드박스 번들을 열면, 앱이 Flutter 초기화 화면(“Initializing”)에서 더 진행되지 않습니다.
같은 날 오전에 같은 기기와 같은 TossApp 버전에서 첫 화면까지 정상적으로 떴던 번들(20260929-9)도, 지금 다시 열면 같은 증상으로 멈춥니다. 20260929-10, -11, -14도 같은 증상입니다.
번들 파일은 바뀌지 않았으므로, 그 사이에 WebView 쪽 동작이 달라진 것으로 보입니다.
[오류]
웹 디버그 툴즈의 Log 탭에 다음 오류가 두 번 기록됩니다.
Uncaught (in promise) TypeError: first argument must be an Response or Promise for Response
[진단 결과]
번들의 가장 앞에 진단 스크립트를 넣어 확인했습니다.
- window.fetch가 Proxy입니다. 문자열로 변환하면 "function ProxyObject() { [native code] }"가 나옵니다. 이 상태는 번들의 어떤 스크립트보다도 먼저 적용되어 있었습니다.
- window.Response가 bind된 함수(“bound Response”)입니다.
- fetch(“canvaskit/canvaskit.wasm”)가 돌려준 객체는 instanceof Response가 true이고 status 200, content-type application/wasm입니다. 그런데 WebAssembly.compileStreaming에 넘기면 위 TypeError로 거부됩니다.
- 같은 응답을 arrayBuffer()로 읽어 WebAssembly.compile에 넘기면 정상적으로 컴파일됩니다.
- 웹 디버그 툴즈를 켜기 전에도 같은 증상이 있었습니다.
Flutter Web은 CanvasKit을 WebAssembly.compileStreaming(fetch(…))으로 불러오기 때문에, 이 단계에서 실패하면 앱이 시작되지 않습니다. 따라서 Flutter Web(CanvasKit 렌더러)으로 만든 다른 미니앱도 같은 영향을 받을 수 있다고 추정합니다. 다만 다른 앱에서는 확인하지 않았습니다.
[현재 대응]
WebAssembly.compileStreaming과 instantiateStreaming을 arrayBuffer()를 거쳐 컴파일하는 방식으로 바꾸는 스크립트를 번들에 넣어 우회했습니다. 이 번들(20260929-18)은 정상 동작합니다.
[문의]
- 샌드박스 WebView에서 fetch와 Response를 감싸는 동작이 최근에 추가되거나 바뀌었는지 알려 주세요.
- 이 동작이 검토 환경과 실제 출시 환경에도 똑같이 적용되는지 알려 주세요.
- 네이티브 Response를 돌려주도록 수정할 계획이 있는지, 아니면 미니앱 쪽에서 스트리밍 컴파일을 쓰지 말라는 것이 권장 사항인지 알려 주세요.
appName (선택)
ttush-push
