앱에서 알 수 없는 예외(exceptions)가 발생 했을 때, 해당 예외를 Log로 남기고 그것을 바탕으로 트러블 슈팅을 하거나 처리를 해주어야 합니다. 하지만, iOS 에서는 예외가 발생 했을 때 코드 내에서 후 처리를 할 수 없으므로 Firebase의 Crashlytics를 활용하여 Log를 남기고 데이터를 바탕으로 트러블 슈팅을 해야 하는데, 그 과정에 대한 기록입니다.
우선 Firebase에 Project를 생성하고, 그 안에 앱을 등록합니다.
그리고 등록하면서 다운로드 받은 GoogleService-Info.plist를 잘 갖고 있어야 합니다.
여기서 중요한 점은 우리는 개발 환경을 분리해서 디버그/릴리즈로 나눠서 사용하고 있기 때문에
앱을 두 개 등록해서 사용해야 합니다. 왜냐하면 App Crash에 대한 기록도 각 빌드 환경에 따라서 분리하여 체크하고 트러블 슈팅을 진행해야 헷갈리지 않기 때문입니다.
위에서 앱을 등록하며 다운로드 받은 GoogleService-Info.plist를 프로젝트의 목록에 추가합니다.
여기서 또 중요한 점은 뭐라고 했죠? 우리는 개발 환경이 분리되어 있다~ 그러므로 해당 plist 또한 두 개를 추가해줘야 합니다. 각 개발 환경에 맞게 파일의 이름을 수정해서 추가해주시면 됩니다. (ex. GoogleService-Info-Debug.plist)
다음은 CocoaPods를 통해 Firebase의 SDK를 설치해줍니다. CocoaPods 말고 SPM(Swift Package Manager)을 통해 설치하는것도 가능합니다. 다만, 후술할 내용에서 일부 코드가 맞지 않을 수 있으니 이점 고려하여 사용하시면 됩니다.
일반적으로 AppDelegate의 application(_:didFinishLaunchingWithOptions:) 메서드에서 구성을 합니다. 다만, 단일 개발 환경에서는 FirebasApp.configure() 한 줄만 적어도 상관 없지만 다중 개발 환경에서는 plist를 개발 환경에 맞게 적용해줘야 합니다.
Target(GoodPharm-iOS) -> Build Settings -> Build Options 에서 Debug Information Format(디버그 정보 형식)을 모두 DWARF with dSYM File로 설정합니다.
다음으로는 Target(GoodPharm-iOS) -> Build Phase 에서 + > New Run Script Phase(새 실행 스크립트 단계)를 클릭해서 새로운 스크립트를 두 개 만들어 줍니다.
한 개는 개발 환경(CONFIGURATION)에 따라 개발 환경에 맞는 plist를 app에서 실제로 사용하는 plist로 파일을 복사해서 넣어주는 스크립트를 만들어 줍니다.
또 하나는 Crashlytics가 dSYM을 처리하기 위한 스크립트를 만듭니다.
Shell(셸) 라벨아래에 있는 스크립트 필드에 dSYM 파일을 처리하고 파일을 Crashlytics에 업로드 하는 스크립트를 위와 같이 추가하고, Input Files(입력 파일) 섹션에서 파일 위치의 경로를 추가합니다.
여기까지 완료 했다면, 우선 Crashlytics의 추가는 완료 되었습니다. 위와 같은 예외 발생 테스트를 통해 Crashlytics로 Log가 넘어가는지 확인하세요.
우선, Crashlytics를 추가 할 Slack 채널의 세부정보로 들어갑니다. 통합 탭에서 앱 추가를 선택하고 Crashlytics를 추가 해주면 됩니다.
추가를 완료하고 나면 이런 설정 화면으로 들어가게 되는데 여기서 중요한것은 웹후크 URL 입니다.
해당 URL을 통해 Firebase Crashlytics와 연동을 할 수 있습니다.
Firebase의 프로젝트 설정에 들어가 Slack을 설치합니다. 이전 단계에서 얻었던 웹후크 URL을 가장 상단의 필드에 입력해줍니다. 그리고 나머지는 채널 이름에 맞게 작성해주시면 연동 작업은 모두 완료되었습니다.
그리고 테스트 메시지를 전송해보면? Slack으로 메세지가 잘 날아오는 모습을 확인 할 수 있습니다.
이를 통해 App Crash가 발생하면 Slack의 알림을 통해 빠른 대처가 가능합니다.