두 앱을 하루에 심사 제출하면 생기는 일
목차
오늘 가장 오래 걸린 건 Flutter 앱 두 개를 같은 날 스토어에 밀어 넣은 것이다. 스펙트럼 분석기(NoiseProof)랑 기도 시간 앱(Salat Light). 둘 다 심사 제출까지 끝냈는데, 그 과정에서 iOS 사인 지옥, iPad 스샷 언어 버그, 8개국어 리스팅 160장 스샷 업로드 자동화까지 뭐 하나 순탄한 게 없었다.
NoiseProof는 MeterKit이라는 내부 라이브러리 위에 올라가 있다. FFT 파이프라인, A-weighting, spectrogram UI, 세션 녹음, 광고/IAP/consent 레이어까지 다 묶어놓은 kit인데 이번에 그걸 처음 제대로 다듬었다. SyntheticSensor를 새로 만든 것도 이 맥락이다 - 데모 모드나 스샷 촬영할 때 실제 마이크 없이 신호를 합성해서 먹이는 구조. 없으면 스샷 찍을 때마다 기기에서 소음을 직접 발생시켜야 하는데 그게 현실적으로 말이 안 된다. spectrogram이 stale 프레임을 렌더링하던 버그도 잡았다 - 최신 버퍼를 re-decode 안 하고 거의 빈 프레임을 계속 그리고 있던 거였다. FFT 정확도 스모크 테스트(440Hz A4, 0dBFS full-scale, A-weighting, silence 케이스)도 이날 처음 추가했다.
앱 아이콘은 스펙트럼 바 모양에 시안+마젠타 on dark 배경. Play용 512px 피처 그래픽도 같이 만들고, 양 플랫폼 launcher icon 세트 다 꽂았다. AdMob ID는 실제 ID로 교체하면서 useTestAds=false로 전환. 광고 정책은 전면 광고 OFF, 앱 오픈 광고는 12시간 쿨다운, 리워드 영상은 최초 1회만(이후 보상 배너는 3일 제거)으로 절제했다. IAP는 $4.99 영구 제거권 하나.
iOS 빌드가 제일 골치였다. SPM 패키지가 섞인 상태에서 아카이브 하려니 자동 서명이 계속 오염돼서 결국 pbxproj를 직접 수동 서명 설정으로 수정했다. ExportOptions.plist도 따로 만들고 ITSAppUsesNonExemptEncryption=false를 Info.plist에 명시했는데, 이걸 안 박으면 export compliance 수동 응답을 매번 해야 한다. ASC 제출할 때 copyright 필드가 필수인데 빈 값이면 그냥 에러 없이 실패하는 게 함정이었다. 배포 프로파일 Q7ARNF63ZH 생성해서 넣고, IPA 26MB로 빌드 성공, TestFlight 빌드 VALID 확인 후 Internal 그룹(hasAccessToAllBuilds) 연결까지. 그다음 App Store Connect로 제출해서 WAITING_FOR_REVIEW 상태로 넘어가는 거 확인하고서야 iOS는 일단락.
8개국어 리스팅은 asc_listing_ml.py로 ASC API 찌르고, 스샷은 iPhone+iPad 조합으로 en/de/es/fr/it/ar/bn/id 다 올렸다. Play 쪽은 play_listing.py, play_screenshots.py로 파리티 맞추고. 그런데 iPad 스샷에서 언어가 섞이는 버그가 있었다 - dart-define으로 locale을 하드코딩해서 빌드해야 하는데 그냥 실행하면 기기 언어를 따라가버린다. 스크립트에서 빌드 인수를 locale별로 넘기는 방식으로 고쳤다. iOS 스샷 64장, Play 스샷 96장, 합치면 160장인데 이걸 API로 올리는 시간이 체감상 가장 길었다.
Salat Light는 기도 시간/아잔 알람/키블라/타스비/히즈리 달력 기능을 담은 앱이다. 오늘은 초기 구현 커밋부터 시작해서 비슷한 파이프라인을 한 번 더 돌렸다 - 8개국어 i18n arb(ar/id/ur/tr/bn/ms/fr + en), release 서명, AAB 검증(50MB), Play 비공개 트랙, iOS 제출까지. 이쪽은 위치 정확도 이슈도 있었다 - high accuracy 모드를 안 쓰면 네트워크 위치 없는 기기에서 기도 시간이 틀려진다. 아잔 억제 윈도우 처리, 히즈리 달력 로컬라이즈, IAP 비블로킹 초기화 같은 건 코드리뷰 반영하면서 같이 정리했다.
그 사이에 플랫폼 쪽 운영자 수익 원장 감사 배치도 만들었다. 수수료 등식 검증이랑 고아 PENDING 상시 알람, 거기에 lot-ledger 이력 누락 건 백필 3건을 STEP 2-b로 추가하고, 델타 보정 방식으로 실제 실행까지 완료했다. SQL 보정 스크립트 커밋이 여러 번 나뉜 게 이 흐름이다. 내용 자체는 섬세한 작업이었는데 앱 빌드 기다리는 시간에 끼워서 했다.
포트폴리오 사이트는 tourism-map 데모를 새로 추가했다 - 마커 시각화, 등급/지역 필터, 엑셀 업로드 관리자 기능이 있는 데모인데, CSV 인코딩 자동 감지(UTF-8 BOM 유무, CP949)를 넣은 게 핵심이다. BOM 없는 UTF-8을 그냥 올리면 깨지던 걸 잡았다. 탭 전환 시 지도가 안 숨겨지는 버그도 있었는데 원인이 좀 황당했다 - #mapView ID 선택자 특이성이 .view 클래스 기반 은닉 규칙을 무력화하고 있던 거였다. .active 스코프로 교정. 검색바 위치도 히어로 아래 sticky 띠에서 사이드바 브랜드 아래로 옮겼다.
Tickettaka 자체충전권 PIN 전환 폴백이랑 muted 텍스트 명암비 보정, OG 이미지 SLECS→WEAVERKIT 브랜딩 교체, 비아쥬원 전용 og 이미지 추가, 쇼핑몰 플랫폼 폐기 마커, 블로그 발행 주기 6→12시간 텀 변경(AdSense 반려 대응) - 이쪽은 사실 퇴근 직전에 처리한 잡무들이다.
앱 두 개를 같은 날 심사 넣는 게 처음은 아닌데, 스토어 자산 자동화 스크립트(ASC API, Play API)가 없었으면 오늘 일정은 물리적으로 불가능했다. 다음 앱부터는 스샷 harness를 먼저 설계하고 개발 중반부터 돌려야 한다는 걸 다시 확인했다. 마지막에 iOS 빌드가 Xcode에서 사인 문제로 한 번 더 막혔을 때 이미 오래 지나 있었는데, pbxproj 직접 수정하고 재빌드 돌리면서 저 파일 건드리는 게 싫다는 감각은 여전히 익숙해지지 않는다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.