← 작업일지

2026-04-23 · v1.0.1

2026.04.23 작업일지 v1.0.1

v1.0.0 이 저장된 18:55 이후에도 다섯 시간이 더 이어졌다. 포모도로 백그라운드 타이머·신규 스킬 3종·심사레이더 iOS 최초 런치 디버그까지. 00:06 에 41aabea 커밋이 찍히며 KST 자정을 넘겨 마감.

v1.0.0 이후 달라진 것 (19:00~00:08)

v1.0.0 이 저장된 시점(18:55 KST) 이후의 활동을 추적. 두 축으로 나뉜다.

  1. 저녁(19:00~23:30): 포모도로 백그라운드 타이머 + 스토어 준비 마무리, 신규 스킬 3종 추가(/insta-post, /create-play-app, /toss-tone 제거), automations 의 play-upload TCC 폴백, 심사레이더 v0.2 디자인 하이브리드.
  2. 심야(23:39~00:08): 강대종님의 “심사레이더 안켜지는데” 한 줄로 시작된 iOS 최초 런치 디버그. 근본원인 2건(Dart SDK 버전 미스매치 + iOS GIDClientID 누락) 을 순차적으로 해결해 iOS 시뮬레이터에서 Google 로그인 consent 다이얼로그까지 정상 도달.

포모도로 — 스토어 직전 마무리

e8a6cf2 20:47  feat(home): idle 시 리셋 버튼 숨김 + non-idle 은 아이콘-only 60×60
bb8e9bb 21:03  chore: bump version to 1.0.0+2
9b75ac8 21:27  feat(pomodoro): 백그라운드 타이머 + 완료 로컬 푸시 알림
  • 홈 화면 리셋 버튼 UX 조정: idle 상태에서는 아예 숨겨 시선 분산 제거, non-idle 은 60×60 아이콘-only.
  • 버전 bump 1.0.0+2 (Play Console 빌드 번호 맞춤).
  • 핵심 기능: 백그라운드 타이머 + iOS/Android 로컬 푸시. 앱 닫혀 있어도 타이머 완료 알림이 뜨도록.

포모도로 개인정보처리방침 — daejong-page

dbda1fe 19:07  feat: privacy policy for 포모도로 (local-only, zero data collection)
  • daejong-page 에 /privacy/pomodoro.html 신규 추가. “로컬 전용, 수집 데이터 0” 선언.
  • Play Console / App Store Connect 제출 시 개인정보처리방침 URL 요구사항 충족.

스킬 3종 — /insta-post, /create-play-app, /toss-tone 제거

beed8fb 20:59  feat: /create-play-app 스킬 + ~/Downloads 샌드박스 lesson
dbe55fa 21:52  feat(insta-post): worklog → 1080×1350 toss-tone card PNG → telegram
ae207f3 23:10  chore: remove /toss-tone skill
  • /create-play-app: Play Console 앱 만들기 자동화(Playwright MCP 웹 UI 클릭 + Android Publisher API probe edits.insert 403→200 검증). ~/Downloads 샌드박스 관련 lesson 동반 기록.
  • /insta-post: 오늘 worklog 를 1080×1350 인스타 카드 PNG 로 렌더해 텔레그램 전송. 반자동(렌더·전송까지, 업로드는 수동).
  • /toss-tone 제거: 기능이 /insta-post 로 흡수돼 중복 제거.

automations — play-upload TCC 폴백 + coord 훅

f8e2399 20:59  feat: play-upload.py ~/Downloads TCC fallback + coord-auto-push hook
  • Play Console 업로드 스크립트에 macOS TCC(권한) 거부 시 ~/Downloads 경로 폴백 추가.
  • coord-auto-push 훅: 좌표 매핑 수정 시 즉시 자동 커밋+푸시. multi-device 좌표 드리프트 방지.

심사레이더 — A2/B1 디자인 하이브리드

a48e0e0 23:25  feat(design): apply A2 Traffic Light + B1 Mono-section hybrid
  • v0.2 디자인 탐색의 결론: A2(Traffic Light 신호등 컴포넌트) + B1(Mono-section 단일 리스트 그룹핑) 하이브리드 채택.
  • 이 커밋 직후 강대종님이 실행 테스트를 시도하며 심야 디버그 세션이 시작됨.

심사레이더 iOS 최초 런치 디버그 (23:39~00:08) ✨

트리거: 23:39 강대종님 “심사레이더 안켜지는데”.

근본원인 1: Dart SDK 버전 미스매치

  • 시뮬레이터 부팅(iPhone 17, iOS 26.2) 후 flutter run 시도 → PATH 에 flutter 없음 → fvm 설치 확인 → ~/fvm/versions/stable/bin/flutter = 3.41.6 (Dart 3.11.4)
  • pubspec.yamlsdk: ^3.11.5 요구 → pub get 실패
  • ~/fvm/versions/3.41.7/bin/flutter = 3.41.7 (Dart 3.11.5+) 로 수동 경로 지정 → 해결

근본원인 2: iOS GIDClientID 누락 크래시

첫 빌드는 성공(Xcode build done. 33.1s), 앱 설치까지 됐으나 런치 직후 SIGABRT:

NSInvalidArgumentException: 'No active configuration. Make sure GIDClientID is set in Info.plist.'

스택: GIDSignIn signInWithOptionsFLTGoogleSignInPlugin signInWithHint:additionalScopes:completion: → HomeScreen initState 의 자동 controller.refresh().

원인: RealGmailService 가 Android-only 가정으로 쓰여졌음(주석: “Android 는 package name + SHA-1 매칭이라 Client ID 코드에 넣을 필요 없음”). iOS 는 Info.plist 의 GIDClientID 키를 요구하는데 한 번도 세팅된 적 없음. 그간 테스트는 S24 에서만.

조치 순서

  1. Mock 임시 스왑(검증용): RealGmailService()MockGmailService(), 커밋 없이 빌드+런치 → UI 정상 렌더 확인(심사레이더 홈 화면, Toss-tone 신호등, 통계 카드). 원인이 UI 가 아닌 OAuth 경로임을 확정.
  2. Mock 스왑 revert: repo 클린 상태로 복구.
  3. GCP iOS OAuth Client 생성: review-radar-493922 프로젝트에 Bundle ID com.ssamssae.reviewRadar 로 iOS Client 추가. 강대종님 수동 작업(GCP 콘솔 Mac 브라우저로 열어 안내).
  4. Client ID 수신 (23:59): 1056684831781-2680sm18t1lhnusu5ooh200j122de6mh.apps.googleusercontent.com
  5. Info.plist 편집: GIDClientID + CFBundleURLTypes → reversed scheme 추가
  6. 재빌드+재런치 (00:04): 크래시 없음, Google 로그인 consent 다이얼로그 정상 노출
  7. 커밋+푸시 (00:06): 41aabea feat(review_radar): iOS Google Sign-In config + CocoaPods integration — Info.plist + 첫 iOS 빌드 부산물(CocoaPods integration artifacts) 묶어서 하나의 커밋

이슈 기록

포스트모템을 /issue 로 기록: 2026-04-23-ios-gidclientid-missing.md. 재발 가능성 high (google_sign_in 쓰는 신규 Flutter 앱은 iOS 에서 동일 재현). Forcing function 3가지 제안:

  • flutter-factory 템플릿에 iOS OAuth 체크 스크립트 추가
  • Dart 레벨 Platform.isIOS 가드에서 GIDClientID 누락 시 StateError 로 fail-fast
  • flutter-factory README 의 OAuth 섹션 첫 문장에 “iOS/Android 별 Client 각각 필요” 명시

관련 커밋 (v1.0.0 이후)

repoSHA시각메시지
daejong-pagedbda1fe19:07feat: privacy policy for 포모도로
pomodoroe8a6cf220:47feat(home): idle 리셋 버튼 숨김
automationsf8e239920:59feat: play-upload TCC fallback + coord 훅
skillsbeed8fb20:59feat: /create-play-app + Downloads lesson
pomodorobb8e9bb21:03chore: bump 1.0.0+2
pomodoro9b75ac821:27feat: 백그라운드 타이머 + 푸시 알림
skillsdbe55fa21:52feat(insta-post): worklog → 카드 PNG
skillsae207f323:10chore: remove /toss-tone
review_radara48e0e023:25feat(design): A2+B1 하이브리드
review_radar41aabea00:06 (04-24)feat: iOS Google Sign-In config
claude-skills273b96300:17issue: iOS GIDClientID 누락 크래시
daejong-page464171600:17issue: 공개본 동기화

총 12개(v1.0.0 작성 시점 13개와는 별개). 00:00 KST 를 넘겨 커밋 2건이 04-24 로 기록되지만 같은 연속 세션.

남은 작업

  • 심사레이더 Safari 로그인 마무리(강대종님 몫): “계속” 탭 → gayoremix@gmail.com → Gmail readonly 승인 → 앱 복귀 → 실제 메모요 심사 메일 렌더 확인
  • flutter-factory 템플릿에 iOS OAuth 체크 스크립트 추가(예방 forcing function 1번)
  • 아이폰 실기 검증(/to-iphone review_radar → /land)