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를 통해 예외처리한다고 생각하니 조금 우스웠다.
그래도 사용자한테는 이런 식으로라도 안내할 수 있는 통로를 마련하는 게 중요하겠다는 점은 무척 납득이 된다.
이런 방법 외에도 더 깔끔한 방법이 있는지, 만약 없다면 이 우회방법을 어떻게 우리 코드에 녹여낼지 고민해보고 적용해봐야겠다.