← 이슈 목록

FROM THE WORKSHOP / 이슈

iOS 재실행 시 SharedPreferencesPlugin 크래시

강대종 · 마이너스베타스튜디오

iOS 재실행 시 SharedPreferencesPlugin 크래시

  • 발생 일자: 2026-04-11 (첫 증상 관측)
  • 해결 일자: 2026-04-12 (근본 원인 제거 완료)
  • 심각도: high (앱 사용 불가)
  • 재발 가능성: medium (Flutter 메이저 업데이트 시 lifecycle 관련 회귀 가능)
  • 영향 범위: 메모요(simple_memo_app) iOS 빌드

증상

앱을 처음 설치하고 실행한 직후에는 정상. 사용자가 앱을 한 번 종료한 뒤 다시 열면 곧바로 EXC_BAD_ACCESS 크래시가 발생하며 홈 화면으로 떨어짐. 재현 조건: 메모 1건 이상 저장 후 앱 완전 종료 → 재실행.

원인

Flutter 3.38 부터 도입된 UIScene lifecycle 로의 마이그레이션이 AppDelegate/Info.plist/Podfile 에 일관되게 들어가지 않아, iOS가 엔진 초기화 전에 Scene 복원을 먼저 시도함. 이 시점에 SharedPreferencesPlugin 이 등록되기 전인 채 복원 데이터를 읽으려다 댕글링 포인터에 접근. 추가로 메모 ID 가 millisecondsSinceEpoch 기반이라 같은 밀리초에 두 건 생성되면 ID 충돌이 나서 상태 복원이 망가지는 잠재 버그도 함께 있었음.

조치

  • iOS UIScene 관련 설정 제거 (AppDelegate 기반 lifecycle 로 되돌림)
  • AppDelegate, Info.plist, Podfile 의 Flutter 관련 항목 정렬
  • runZonedGuarded 로 메인 영역을 감싸 uncaught exception 시 크래시 대신 로그가 남게 보강
  • 메모 ID 생성을 UUID v4 로 교체해 충돌 가능성 제거
  • 재실행 10회 연속 정상 동작 확인 후 릴리즈

예방 (Forcing function 우선)

  • 앞으로 Flutter 메이저/마이너 업데이트 후에는 iOS 빌드에서 앱 종료 후 재실행 시나리오를 기본 smoke test 에 포함. simple_memo_app 의 CI/수동 체크리스트에 “clean install → 메모 1건 저장 → 앱 강제종료 → 재실행 → 메모 유지 확인” 3단계 명시.
  • ID 생성 타임스탬프 방식은 금지, 새 Flutter 앱 스캐폴드(flutter-factory) 의 local_store 템플릿에 UUID v4 기본값을 박아둠.

재발 이력

(없음)

관련 링크

  • 복구 커밋: simple_memo_app 4/12 스토리
  • 작업일지: docs/worklog/2026-04-11, 2026-04-12
  • 메모리: project_memoyo_build_naming.md
기록은 다음 시작이 됩니다.이슈 더 읽기 ↗이 작업장의 제품 ↗
작업장 전체 페이지 목적에 맞는 페이지 찾기