iOS 26에서 CAEmitterLayer 폭죽이 안 터진다 — 전체폭 line emitter 방출 드롭 회귀 디버깅기

TestFlight 빌드를 받은 테스터에게서 피드백이 왔다. “축하 화면에서 폭죽이 안 터지는데?” NFC 태그 등록에 성공하면 전면 축하 화면과 함께 색종이(confetti)가 쏟아지게 만들어놨는데, 실기기에서 카드만 뜨고 파티클이 전혀 안 보인다는 거다. 코드를 보면 멀쩡하다. CAEmitterLayer를 UIViewRepresentable로 감싼 전형적인 confetti 구현이고, 시뮬레이터 프리뷰에서는 몇 달 전부터 잘 돌았다. 그런데 iOS 26 실기기에서는 빌드를 두 번 갈아엎어도 안 터졌다. 결론부터 말하면 iOS 26에서 emitterSize가 화면 전체폭인 .line emitter는 셀 구성과 타이밍이 전부 정상이어도 방출 자체가 통째로 드롭되는 회귀가 있었고, 검색해도 안 나오는 문제라 A/B 판별로 직접 격리해야 했다. 이 글은 그 4라운드 디버깅 기록이다. 가는 길에 SwiftUI @Observable의 수동 Binding 추적 단절, updateUIView zero-bounds 레이스 같은 다른 함정도 두 개 잡았다. ...

2026-07-03 09:56 · 8분 소요 · Seunghan

macOS 앱 Google 로그인이 Chrome에서 먹통 — ASWebAuthenticationSession 버그와 external browser 우회

iOS/macOS 코드를 같은 Swift 패키지로 공유하는 앱을 만들고 있다. 로그인은 Apple/Google SSO를 쓴다. iOS에서는 Google 로그인이 잘 됐다. 그런데 macOS 빌드에서만 Google 로그인이 끝까지 완료가 안 됐다. 버튼을 눌러도 아무 반응이 없거나, 인증창이 떠도 “계속"을 누르면 OAuth 동의 페이지가 안 뜨고 브라우저 창만 덜렁 열렸다. 같은 코드인데 왜 한쪽 플랫폼에서만 깨지는가. 이게 며칠간 이어진 삽질의 시작이었다. 결론부터 말하면 범인은 ASWebAuthenticationSession이었고, macOS에서는 이 API를 쓰지 않고 외부 브라우저를 직접 여는 방식으로 바꿔서 해결했다. 이 글은 그 과정과, macOS 데스크톱 OAuth를 어떻게 구현해야 하는지에 대한 정리다. ...

2026-06-26 11:04 · 8분 소요 · Seunghan

AI 흔적 지우기 스킬 vs AI한테 리뷰받기 — Codex가 짚어준 SwiftUI 보안 구멍 8개

GitHub 둘러보다가 im-not-ai라는 Claude Code 스킬을 봤다. 한국어로 AI가 쓴 글의 흔적을 지우는 도구다. 영어 기반 AI 탐지기는 한국어를 잘 못 잡는다는 문제 의식에서 출발해서, “번역체 흔적” — 수동태 남발, 문장 첫머리 접속사, 1·2·3 병렬 구조 — 같은 10개 카테고리 40+개 서브패턴을 분류하고 S1/S2/S3 심각도로 매겨서 다듬어주는 식이다. 페이지 하단에 명시적으로 “이건 탐지 회피 도구가 아니라 글 품질 개선 유틸리티다"라고 박혀 있는 점이 인상적이었다. 흥미로운 도구긴 한데 보다가 좀 다른 생각이 들었다. AI 흔적을 지운다고 그 글이 사람 글이 되는 건 아니지 않나. 진짜 사람 저자성이라는 게 있다면 그건 표면의 문체가 아니라 검증하고 판단하는 행위 쪽일 텐데. 글 영역은 일단 옆에 두고, 코드 영역에서는 그게 더 명확하다. AI가 짠 코드인지 들키지 않으려고 변수명 바꾸고 주석 다는 시간보다, AI한테 한 번 더 리뷰시켜서 내가 못 본 구멍을 메꾸는 시간이 훨씬 author 행위에 가깝다. ...

2026-05-13 10:43 · 11분 소요 · Seunghan
개인정보처리방침 이용약관 면책조항 문의