[iOS 18주차] FamilyActivityPicker: Crash Handling

DoyleHWorks·2025년 2월 20일
0

문제 배경

FamilyActivityPicker가 이따금 Crash되는 오류가 있었다.

[iOS 16주차] 문제 해결: UIViewController에서 FamilyActivityPicker 호출하기

처음에는 위의 글처럼 SwiftUI에서만 불러올 수 있는 FamilyActivityPicker를 UIKit 기반의 코드 속에서 불러와서 그런 줄 알았는데, 더 리서치해보니 이 FamilyActivityPicker 자체가 무척 불안정한 걸 알 수 있었다. 첫번째로 이미 출시된 앱들에서 같은 UI를 불러왔더니 똑같이 불안정한 모습을 보였고, 두번째로는 애플 포럼의 Screen Time 태그를 살펴봤더니 금방 관련 글을 찾을 수 있었기 때문이다. 2022년부터 버그 리포트는 계속 들어가고 있으나, 아직도 해결이 안되고 있다고 한다(...)

문제 파악

근본적으로 불안정한 FamilyActivityPicker는 Apple 측에서 해결해주지 않으면 이도저도 못하지만, 우리 앱에서 여전히 처리해주어야 했던 것은 크래쉬가 떴을 때 비어버린 모달을 내려서 뒤로 가는 것조차 불가능한 점이었다. 이는 아마 SwiftUI 기반이었다면 자연스럽게 해결되겠지만 UIKit에서 우회하여 보여주느라 그런 것 같다.

Crash 난 FamilyAcitivityPicker 의 모습
이 상태에서 앱을 종료하는 것 외에는 방법이 없다

문제 접근 및 해결

이 문제는 생각보다 간단하게 해결 가능하였다.

struct FamilyActivityPickerWrapper: View {
    
    @Environment(\.dismiss) private var dismiss
    @Binding var isPresented: Bool
    @Binding var selection: FamilyActivitySelection
    
    var body: some View {
        Color.clear
            .familyActivityPicker(isPresented: $isPresented, selection: $selection)
            .onChange(of: isPresented) { newValue in
                if !newValue {
                    dismiss()
                }
            }
    }
}

위와 같이 dismiss를 Environment 변수로 선언해주고, isPresented와 연결해주었더니 Crash가 떴을 때 모달을 드래그하여 뒤로 가는 게 가능해졌다.

추가 문제 해결 가능성

다른 앱(Opal)에서는 이런 문제에 대해서 아래와 같이 크래쉬를 처리하는 것을 발견했다.

This "Apple" screen has crashed 나, We've raised this issue with "Apple"와 같은 문장에서 근본적으로 Apple 측에서 해결해야 하는 문제란 뉘앙스를 마구 뿜어내고 있다 😂

FamilyActivityPicker의 crash를 어떻게 catch해야 하는지 찾아보다가 아래의 글을 발견했다.

https://developer.apple.com/forums/thread/764457?answerId=805628022#805628022

이런 번거로운 workaround를 사용하는 걸 보니, 아무래도 crash를 직접 받아서 처리하는 건 불가능한 모양이다.
근본적인 문제를 둘러싸고 workaround를 통해 예외처리한다고 생각하니 조금 우스웠다.
그래도 사용자한테는 이런 식으로라도 안내할 수 있는 통로를 마련하는 게 중요하겠다는 점은 무척 납득이 된다.

이런 방법 외에도 더 깔끔한 방법이 있는지, 만약 없다면 이 우회방법을 어떻게 우리 코드에 녹여낼지 고민해보고 적용해봐야겠다.

profile
Reciprocity lies in knowing enough

0개의 댓글

관련 채용 정보