H-eat+
.기업용사용자가 네트워크가 불안정한 환경에서 QR 을 찍으면 결제 화면이 앱 강제 종료 로 끝나는 버그가 있었다.
진짜 원인은 IUO (
Type!) + 옵셔널 체이닝 (?.IUO_Obj.x) 조합
핫픽스로 5개 IUO 프로퍼티를 모두 평범한 옵셔널 (
?) 로 바꾸고, 호출부 35곳을 일일이guard let으로 풀어 막았다. 덤으로 영수증 페이지가 가끔 오류로 뜨던 별개 버그까지 같이 해결됐다.
운영에서 올라온 Crashlytics 리포트:
EXC_BREAKPOINT (0x00000001023f71bc)
closure #1 in closure #3 in GeneralCameraPaymentVC.codeScanningCameraOutput(codeString:imgYn:)
증상은 단순했다.
.기업용 bizType 사용자가 결제 화면에서 QR 을 카메라로 인식하는 순간 네트워크가 불안정하거나 서버가 잠깐 응답을 못 줄 때 결제 화면이 그대로 강제 종료됐다.사용자가 다시 시도해도 같은 경로라서 결국 결제 자체를 못 한다. 재시작·앱 재설치도 안 통하는, 사용자 차원의 우회가 막힌 P1 차단성 결함.
다행히 트랜잭션이 실제로 시작되기 전 단계라 데이터 손실은 없었다. 그게 P0 가 아니라 P1 인 이유.
Swift 에는 세 가지 옵셔널 표기가 있다.
| 표기 | 이름 | 평소 모습 |
|---|---|---|
Foo |
non-optional | nil 일 수 없음. 사용 시 그냥 씀 |
Foo? |
optional | nil 일 수 있음. 사용 전에 풀어야 함 (if let / guard let / ?.) |
Foo! |
IUO | nil 일 수 있는데, 컴파일러가 옵셔널인 척 안 함. 매번 자동으로 강제 언래핑 |
💡 비유하자면 IUO 는 "항상 펴진 채로 들고 다니는 자동 우산" 이다.
- 평범한 옵셔널은 "접힌 우산" - 펴려면 손으로 펴야 한다 (
if let).
- IUO 는 "기본적으로 펴진 상태인 척" 한다. 코드 어디서든 그냥 들고 쓰는 것처럼 굴 수 있다.