Firebase

FirebaseCrashlytics 적용하기 with SPM

Hamp 2024. 12. 26. 18:37
반응형

👋 들어가기 전

 

2024년 12월 25일 크리스마스 .. 나는 26일 새벽 4시까지 현재 프로젝트를 위해 약 13시간 코딩을했다.

 

마지막 시점에 비정상 종료를 추적하기 위한 Firebase Crashlytics를 적용하려

했지만 많은 억까를 당했고 현재 26일 오후 4시 기준 드디어 성공해 기록을 남기려 한다..


✊ 프로젝트 생성 및 GoogleService-Info.plist 발급 받기

프로젝트 생성과 GoogleService-Info 발급은 파이어베이스 공식 홈페이지에 너무 잘나와있으니 홈페이지를 참고하자


☝️ Xcode 상단에 GoogleService-Info.plist 넣기

 

위 그림과 같이 최상단에 GoogleService-Info.plist 파일을 위치시킨다.


✌️ SPM을 통한 firebase-ios-sdk 설치

https://github.com/firebase/firebase-ios-sdk.git

 

SPM을 이용해 위 sdk를 설치하자 이때 내가 필요한 것만 타겟 추가하자.

 

나는 여기서 Core, Analytics, Crashlytics를 추가한다. 

 


 👍 Linker 설정 및 dsym 설정

1. Other Linker Flags -Objc 설정 

 

Objective-C에서 카테고리(Category) 또는 특정 Objective-C 메타데이터를 포함하는 정적 라이브러리를 사용할 때,
기본적으로 링커는 사용되지 않는 심볼을 제거한다.

 

-ObjC 플래그는 링커가 이러한 Objective-C 카테고리와 메타데이터를포함한 모든 심볼을
강제로 로드하도록 한다

 

정리하면

  • 정적 라이브러리에서 Objective-C 카테고리를 포함한 코드를 자동으로 로드
  • 앱에서 참조하지 않더라도, 정적 라이브러리의 모든 Objective-C 클래스와 메타데이터를 로드하여 누락 문제를 방지

 

2.   Debug Information Format 설정

 

위 사진과 같이 Debug Information Format을 DWARF with dSYM File로 설정한다.

 

DWARF (Debugging With Attributed Record Formats)

  • DWARF는 디버깅 정보를 저장하기 위한 표준 파일 포맷
  • 소스 코드의 함수, 변수, 메서드, 파일 위치 등의 정보를 포함한다.
  • 이 정보는 애플리케이션이 실행 중인 메모리 주소를 소스 코드의 실제 함수나 줄 번호와 매핑하는 데 사용된다.

 

dSYM (Debug Symbols File)

  • dSYM 파일은 DWARF 디버깅 정보를 별도의 파일로 분리하여 저장한 파일
  • 최적화된 릴리스 빌드(Release Build)에서 소스 코드의 디버깅 정보를 유지하기 위해 사용
  • 스택 트레이스(Stack Trace)에서 난독화된 메모리 주소를 디코딩하여 개발자가 소스 코드 수준에서 충돌 원인을
    파악할 수 있도록 돕는다.

이렇게 설정을 해야 디음과 같이 Crashlytics에서 사용할 수 있다.

3.   Arguments 설정

Edit-scheme -> Arguments 탭에 -FIRDebugEnabled 를 추가한다.


😡 Build Phase Scripts

드디어 어제 막혔던 부분이다.

이제 Crashlytics를 동작을 명시할 스크립트를 짜는데 여기서 문제가 발상핸다.

https://github.com/firebase/firebase-ios-sdk/blob/main/SwiftPackageManager.md

 

Firebase 공식문서 Readme를 살펴보면  build phase script에 다음과 같은 동작을 명시한다.

${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run

 

어쩌고 저쩌고 run파일을 실행하라는 뜻 같다 저 앞의 경로를 추적해보니 아래와 같이 찾을 수 있었다.

 

한번 실행해보자.

 

여기서 어제 멘붕이 왔다. 분명GoogleService-Info.plist을 가장 처음 단계에서 추가했는데 왜 못 읽지??
여기서 gpt , stackoverflow 여러가지를 봤지만 해결하지 못했다..

그런데, 등잔 밑이 어둗다고 했던가 .. 위 Firebase 공식 리드미에 그 내용이 바로 적혀있다.

 

정확한 원인 분석은 안됐지만 Xcode 15 이상에서 Sandboxing 설정이 영향을 줄 가능성이 있고
첨부된 링크를 살펴보니

 

다음과 같이 단순 스크립트 뿐만아니라 plist dsYM 파일등을 직접 위치와함께 첨부해야한다고 한다.

https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?platform=ios&authuser=0&hl=ko&_gl=1*112rnry*_up*MQ..*_ga*OTU4MDg4MDE4LjE3MjM4NzYyNzE.*_ga_CW55HF8NVT*MTczNTE5NzM3My45MS4xLjE3MzUyMDA0NTYuMzMuMC4w

 

리드미뿐만아니라 공식문서에서도 해당 이슈가 업데이트가되어 쉽게 넣을 수 있게 제공되니 참고하자.

 

다시 쓰기 편하기 위해 아래 코드를 복붙할 사람은 편하게 복붙해도 좋다.

 

- Script

"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"

 - Input Files

${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist
$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist
$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)

 

마지막으로 또 중요한 것은 바로 Build Phases에서 지금 작성한 스크립트가
반드시 Copy Bundle Resources 아래에 있어야한다.

 

왜냐하면 위에 input 파일로 필요한 파일들을 넣어 놨는데 그 파일을 사용하는 곳이 
Copy Bundle Resources 단계에서 먼저 읽어야 우리가 쓸 수 있다.

 

그렇지 않으면 다음과 같은 오류를 만나게된다.

 

순환 참조 관련 오류로 추측된다.


😭 Debug 끄고 실행

드디어 마지막 단계이다.

여기서도 은근 시간이 걸렸는데 파이어베이스 공식 설명을 보면

Xcode 내에 있는 디버거가  동작하고 있으면 Crashlytics로 dsYM이 전송되지 않는다고 한다.

 

실제로 이 옵션을 끄지 않고 실험했는데 계속 안와서 멘붕에 빠졌었다.

 

옵션은 다음과 같이 끌 수 있다. 

Product -> Scheme -> Edit Scheme -> Run -> Debug executalbe 체크 끄기

 

 

이후 다음과 같이 AppDelegate.swift에서 FIrebase를 설정하고 앱을 터트리면 된다.

 

여기서 import는 꼭 Crashlytics까지 해주자.

import UIKit
import Firebase
import FirebaseCrashlytics

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

😀 소감 및 마무리

화가나서 쓰니 오히려 소감이 진짜 후련하다 밖에 없는 것 같다.

 

공식문서를 먼저 봐야하는 습관을 이번에 확실히 느끼게 된 것 같다.

 

앞으로는 공식문서 -> stackoverflow -> gpt 순으로 살펴보는게 오히려 더 깊고 확실할 것 같다.


출처

 

Crashlytics 대시보드에서 읽을 수 있는 비정상 종료 보고서 받기  |  Firebase Crashlytics

2024년 데모 데이에서 Firebase를 사용하여 AI 기반 앱을 빌드하고 실행하는 방법에 관한 데모를 시청하세요. 지금 시청하세요. 의견 보내기 Crashlytics 대시보드에서 읽을 수 있는 비정상 종료 보고서

firebase.google.com

 

 

firebase-ios-sdk/SwiftPackageManager.md at main · firebase/firebase-ios-sdk

Firebase SDK for Apple App Development. Contribute to firebase/firebase-ios-sdk development by creating an account on GitHub.

github.com

 

 

Update upload-symbols to 3.16 to support Xcode 15 by samedson · Pull Request #11463 · firebase/firebase-ios-sdk

This should resolve some of the issues mentioned in #11400 Change 1: Support Non-embedded / No Info.plist It's becoming more common that developers don't have an Info.plist file embedded in...

github.com

 

 

반응형