이 글의 성격은 무엇인가요?
질문 / 문제 해결
내용을 설명해주세요
환경
- 플랫폼: iOS Sandbox 앱
- SDK 버전: @apps-in-toss/web-framework@1.6.0
- 앱 유형: WebView 기반 미니앱
- Android: 정상 동작
증상
saveBase64Data 호출 시 iOS에서 앱이 즉시 크래시됩니다.
JavaScript 에러 없이 앱 자체가 종료됩니다.
조사 과정 및 인사이트
- 데이터 크기 문제 가능성 배제
처음에는 PDF 파일(수 MB) 저장 시 크래시가 발생하여 데이터 크기
문제를 의심했습니다. 이를 검증하기 위해 1x1 픽셀 PNG (96 bytes)
로 테스트한 결과 동일하게 크래시가 발생했습니다.
→ 데이터 크기와 무관한 문제
- JavaScript 레벨 오류 가능성 배제
SDK 내부 동작을 추적하기 위해 두 패키지에 디버그 로그를
삽입했습니다.
@apps-in-toss/web-bridge (bridge.js)
- saveBase64Data 함수 진입점에 로그 추가
- 목적: 함수 호출 여부 및 파라미터 확인
@apps-in-toss/bridge-core (index.js)
- createAsyncBridge 내부 각 단계에 로그 추가
- 목적: 네이티브 통신 흐름의 어느 시점에서 크래시가 발생하는지
특정
- 로그 결과
saveBase64Data 함수 진입
createAsyncBridge로 bridge 함수 생성
eventId 생성: “w9q9v0qvtlr”
resolve/reject 이벤트 리스너 등록
postMessage 호출 (메시지 구성 완료)
ReactNativeWebView.postMessage() 호출
ReactNativeWebView.postMessage() 반환 (메시지가 네이티브로
전달됨)
“waiting for native response…” 로그 출력
이후 앱 크래시 (resolve/reject 콜백 도달 전)
- 결론
ReactNativeWebView.postMessage()가 정상적으로 반환된 후
크래시가 발생합니다. 이는 JavaScript → Native 메시지 전달은
성공했으나, iOS 네이티브의 saveBase64Data 핸들러가 메시지를
처리하는 과정에서 크래시가 발생함을 의미합니다.
재현 방법
- WebView 기반 미니앱에서 아래 코드 실행
import { saveBase64Data } from ‘@apps-in-toss/web-framework’;
// 1x1 pixel PNG (96 bytes)
const TINY_PNG = ‘iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJA
AAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==’;
await saveBase64Data({
data: TINY_PNG,
fileName: ‘test.png’,
mimeType: ‘image/png’,
});
- iOS Sandbox 앱에서 실행 → 즉시 크래시
- Android에서 동일 코드 실행 → 정상 동작
질문
iOS 네이티브 saveBase64Data 핸들러 쪽 크래시 로그 확인이
가능할까요? WebView에서 전달한 메시지는 정상이며, 네이티브
핸들러 내부에서 문제가 발생하는 것으로 보입니다.
appName (선택)
qanda-scanner