[WWDC21] Triage TestFlight crashes in Xcode Organizer

sokyte
daily-monster
Published in
13 min readJan 21, 2024

--

안녕하세요. 일간 괴물의 일욜 괴물 소깡이 입니다. :)

오늘은 Xcode Organizer를 이용해서 TestFlight의 Crash를 분류/분석하는 방법에 대해서 알아보도록 하겠습니다.

해당 내용은 WWDC21의 ‘Triage TestFlight crashes in Xcode Organizer’를 보고 작성한 글입니다.

*잘못된 내용이나 궁금하신 내용이 있으시다면 댓글로 알려주세요 ~

이번 글의 내용은 크게 두 가지입니다.

  1. Organizer crash reporting
  2. Terminations and MetricKit

그럼 시작해 보겠습니다 ~ 🤓🔥

Organizer crash reporting

먼저 Organizer에서 제공하는 crash report가 어떤 것이 있는지 알아보도록 하겠습니다.

Apple에서 말하길 .. Organizer를 이용하면 crash 분석과 함께 TestFlight 사용자로부터 피드백을 이용하여 빠른 시간 내에 crash를 수정할 수 있다고 말합니다.

☝🏻 Xcode에서 Organizer를 확인하려면?

Xcode 메뉴바 > Window > Oraganizer를 통해서 열 수 있고, 위의 이미지에서 확인할 수 있는 것처럼 ⌥(option) + ⇧(shift) + ⌘(command) + O 단축키를 사용해서 열 수 있습니다.

💬 사용자로부터 피드백?

TestFlight에 초대된 테스터들은 앱을 이용하다가 crash가 발생한 경우 아래와 같이 피드백을 보낼 수 있습니다.

해당 피드백은 App Store Connect에서 확인할 수 있습니다. 그리고 crash log를 다운로드 하여 어떤 이슈인지 분석할 수 있습니다.

그리고 Xcode13에서는 위의 워크플로우를 강화했다고 합니다. 어떻게 강화된 것인지 알아볼까요?

Before Xcode13

  • App Store and TestFlight : 앱스토어 및 테스트플라이트의 앱에 대한 충돌 감지 지원
  • App Platforms and app : App Clip 및 extension을 포함한 앱의 crash 표시
  • Ranked issues : 이슈를 순위별로 정렬하여 우선순위가 높은 crash부터 정렬
  • Distribution metrics : 해당 충돌이 기기 및 OS 버전에 어떻게 분포되어 있는지 표시
  • Open log in project : log에 해당하는 코드를 프로젝트에서 바로 확인 가능
  • Simple setup : Xcode에 개발자 계정으로 로그인만 하면 즉시 사용 가능

✨ In Xcode13

Xcode13에서는 Crash Organizer를 개선하여 충돌로그를 즉각적으로 받을 수 있도록 하고, 더 많은 데이터를 제공한다고 합니다.

이슈 재현의 어려움을 해결하고자 말이죠 !!

위와 같이 6가지의 주요 개선사항이 있습니다. 하나씩 살펴보도록 하겠습니다.

1. Speedy delivery of your TestFlight

TestFlight를 통해 빠르게 피드백을 받아볼 수 있도록 지난 하루 동안의 모든 TestFlight crash를 확인할 수 있습니다.

또한 선택한 crash가 언제 발생했는지(어떤 기기, 버전에서 발생했는지) 시간 그래프도 확인할 수 있습니다.

2. Crash history

지난 하루 동안의 내역 뿐만 아니라 1년치의 crash 내역을 확인할 수 있습니다.

그리고 1년치의 crash를 표시할 수 있기 때문에 월간 기준으로 그래프를 통해서 데이터를 분석할 수 있습니다.

3. More filtering options

모든 버전 및 빌드에 대해서 필터링을 하여 볼 수 있고 이전 릴리즈도 확인할 수 있습니다.

앱 뿐만 아니라 extension(ex, watch, app clip, share extension)도 필터링하여 볼 수 있습니다.

macOS, watchOS에 대한 결과도 확인할 수 있습니다.

4. More distributions metrics

crash를 해결하는 과정 속에는 코드를 확인하는 작업만 포함되어 있는 것은 아닙니다.

crash에 영향을 받는 사용자가 누구인지, 그리고 해당 crash가 어떤 범주에 어떻게 분포되어 있는지 등을 파악하여 crash에 대한 전반적인 그림을 얻는 것입니다.

Xcode13에서는 특정 crash가 앱 버전 및 App Store 전반에 걸쳐서 어떻게 분포되어 있는지 확인할 수 있습니다.

5. Shareable crash reports

crash report를 공유할 수 있는 새로운 방법이 추가되었습니다.

Tool Bar의 공유 버튼을 통해 팀 멤버와 직접 crash를 공유하거나 Reminders에 추가할 수 있습니다.

또한, Copy Link를 통해 공유하면 전달받은 사람은 링크를 클릭하여 문제를 다운로드 하고 crash를 분석할 수 있습니다.

6. TestFlight crash feedback

App Store Connect를 통해 Crash Feedback을 확인할 수 있고 다운로드 할 수 있습니다.

또는 ‘Open in Xcode’ 버튼을 통해 Xcode에서 바로 확인할 수 있습니다.

해당 crash에 대해 ‘Open in Xcode’ 버튼을 눌러서 확인해 볼까요?

선택한 crash를 겪은 모든 테스터들이 제출한 피드백을 볼 수 있습니다. 이 기능을 통해 이슈 해결을 위해 필요한 추가 정보를 빠르게 찾을 수 있습니다.

그렇다면, Demo App을 통해 어떻게 이슈를 확인/재현/해결할 수 있는지 살펴보겠습니다.

먼저, 왼쪽 사이드 바를 통해서 Xcode에서 iOS 앱 Fruta에 대한 Crash Organizer를 열었음을 알 수 있습니다.

창 상단의 툴 바에는 올해 추가된 여러 필터 옵션이 있습니다.

그리고 필터 아래에는 2주 동안의 모든 버전, 빌드 및 제품에 걸친 모든 충돌을 보여주는 crash 목록이 있습니다.

이 목록을 빠르게 스캔하여 다양한 종류의 문제를 확인할 수 있습니다.

그리고 목록을 보면 해당 crash가 App Clop, Wathc App 또는 Extension에서 발생했는지 정보를 배지를 통해서 보여주고 있습니다.

그리고 하나의 crash를 선택하여 친숙하고 단순한 UI로 Log를 확인할 수 있습니다.

오른쪽 그래프 창을 통해 선택한 crash에 대한 다양한 정보를 얻을 수 있습니다.

이제 하나씩 자세히 살펴보겠습니다.

먼저 App Clip을 선택하고 2주 동안의 crash를 확인해 보겠습니다. 그러면 가장 상단에 우선순위가 높은 crash가 표시되는 것을 볼 수 있습니다.

  • 지난 2주 동안
  • 21대의 기기에 영향을 미쳤으며
  • 어제까지 7대에서 문제가 발생했음을 알 수 있습니다.

바로 코드를 통해 문제를 해결하기 전에 몇가지 조사를 해볼까요?

먼저, 이 문제가 얼마나 발생했는가? 확인해 보겠습니다.

  • 2.0 버전에서 처음 발생한 문제이고
  • 최신 TestFlight 빌드 (2.0.1)에도 영향을 미친 것을 확인할 수 있습니다.

다음으로, 릴리즈 된 제품 앱에 영향을 주는 것인지 아니면 TestFlight에 영향을 주는 것인지 확인해 볼까요? Release 필터를 선택하여 확인해 보겠습니다.

  • TestFlight와 App Store 빌드 모두 영향을 미치는 것을 확인할 수 있습니다.

그렇다면 .. ! 이 문제는 고객(베타 유저가 아닌 실제 사용자)가 경험하고 있는 문제이므로 긴급한 이슈이고 최근 App Store 릴리즈에서 문제가 발생한 것으로 확인되었습니다.

이제 로그를 통해 확인해 볼까요?

crash가 발생한 프레임을 강조하여 보여줍니다.

Thread 6에서 문제가 발생했으며 백그라운드 쓰레드에서 문제가 발생한 것으로 보입니다.

로그를 통해 ‘즐겨찾기'를 동기화 하는 과정에서 이슈가 발생한다 .. 라는 정보까지 알 수 있지만 담당 개발자가 아니라면 해당 피쳐에 대해 더 많은 지식이 필요할 수 있습니다.

즉, 충돌에 대한 몇가지 context가 필요합니다.

다행히, 피드백 아이콘을 보니 여러 테스터가 제출한 피드백을 볼 수 있습니다.

여러 테스터가 동일한 crash를 경험했고 방금 전에 도 보고된 것이 있습니다.

방금 들어온 피드백을 선택하여 자세히 확인해 볼까요?

하나를 선택하면 팝 오버 형태로 세부 정보가 표출됩니다.

crash에 대한 정확한 버전 및 빌드, 기기 모델, 배터리 수준, 사용 가능한 디스크 공간까지 확인할 수 있습니다.

피드백 내용은

터널을 통과하고 있는 도중에 즐겨찾기 버튼을 눌렀다가 몇 초후 앱이 꺼졌습니다.

입니다.

그렇다면 .. 개발자들은 ‘터널 통과 중이라면 .. 네트워크 연결 상태가 불안정한 상황일 수 있겠군 ..’ 이렇게 추측할 수 있습니다.

이러한 정보와 함께 이제 프로젝트로 이동하여 코드를 보겠습니다.

‘Open in Project’ 버튼을 눌러 프로젝트를 열어봅시다.

이렇게 문제가 발생한 부분을 보여줍니다.

위에서부터 코드를 살펴볼까요?

  • syncFavorite 함수는 백그라운드 쓰레드에서 동작하고
  • 디스크에 즐겨찾기로 저장하고
  • Backend()를 업데이트 하며
  • 이러한 작업을 동기화하기 위해 Dispatch Group을 이용합니다.

🚨 그리고 10초의 타임아웃이 있고 작업이 그 이상이 걸리게 되면 crash가 발생합니다.

위의 Organizer로 분석한 피드백, 테스터가 네트워크 상태가 좋지 않은 터널에서 crash가 발생했다,을 고려하면 해당 crash는 타임아웃이 너무 짧아서 발생한 것으로 보입니다.

사용자가 터널을 통과하는 등의 네트워크가 좋지 않은 상황에 있는 경우 백엔드 동기화 작업이 10초 이상 걸릴 수 있습니다.

이제 이 문제를 Combine을 통해 해결해 봅시다.

  • saveFavorite() 과 updateFavorite(data: data) 결과를 .zip하고
  • 타임아웃을 30초로 연장하고
  • 타임아웃이 발생한 경우 crash 대신 completionHandler를 호출하도록 수정했습니다.

이렇게 해서 사용자가 보낸 피드백에 대해 context를 이해하고 문제를 빠르게 수정할 수 있습니다.

만약, 팀원이 링크를 공유한 이슈에 대해서는 어떻게 해결할 수 있을까요?

팀원 중 한 명이 새로운 공유 기능을 통해 crash 에 대한 링크를 보냈습니다.

해당 링크를 클릭하면,

단일 crash에 중점을 두고 어떤 이슈인지 보여줍니다.

이렇게하여 팀원이 공유한 이슈에 대해서도 빠르게 확인할 수 있습니다.

Terminations and MetricKit

MetricKit를 이용하면 다양한 정보를 얻을 수 있습니다.

  • Track unexpected terminations
  • Categorized reasons
  • Compare by app version
  • On-screen and background

어떤 종류의 crash인지 카테고리를 확인할 수 있습니다.

버전 별로의 terminations도 확인할 수 있습니다.

또한, foreground에서 발생한 것인지 background에서 발생한 것인지도 확인할 수 있습니다.

… MetricKit에 대한 더 자세한 설명을 듣고 싶다면 Application performance survival guide (WWDC21) 과 Why is my app getting killed (WWDC20) 세션을 참고해 주세요.

import MetricKit

class Subscriber: NSObject {
override init() {
super.init()
MXMetricManager.shared.add(self)
}

deinit {
MXMetricManager.shared.remove(self)
}
}

extension Subscriber: MXMetricManagerSubscriber {
func didReceive(_ payloads: [MXDiagnosticPayload]) {
payloads.forEach {
if let crashDiagnostics = $0.crashDiagnostics {
// Begin analyzing crash diagnostic payload.
}
}
}
}

MetricKit의 delegate를 통해 Crash Log를 수집할 수 있습니다.

이렇게 .. ! Xcode Organizer를 통해서 앱 crash log를 분석하고 사용자 피드백을 받아볼 수 있습니다.

저는 그동안 Orgainzer에 대해서 잘 몰랐었는데요 .. ! (이슈 분석이라고 하면 Google Analytics 나 .. 서버에 남은 로그만 확인했었습니다 .. 😅 )

이번 세션을 통해서 Organizer에 대한 기능을 새롭게 알 수 있었고 무엇보다 데모 앱의 이슈 해결 과정을 보면서 현업에서 다양하게 활용할 수 있을 것이란 생각이 들었습니다.

Xcode에서 제공하는 여러 기능을 다 알게 되는 그 날까지 .. 열심히 공부해 보겠습니다 !!!!

그럼 내일 업로드 될 월욜 괴물😈의 글도 많이 기대해 주시고 다음주에 뵈어요 ~~ 👋🏻👋🏻

--

--