👋 들어가기 전
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를 동작을 명시할 스크립트를 짜는데 여기서 문제가 발상핸다.
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 파일등을 직접 위치와함께 첨부해야한다고 한다.
리드미뿐만아니라 공식문서에서도 해당 이슈가 업데이트가되어 쉽게 넣을 수 있게 제공되니 참고하자.
마지막으로 또 중요한 것은 바로 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 순으로 살펴보는게 오히려 더 깊고 확실할 것 같다.
출처
'iOS' 카테고리의 다른 글
패키지 만들기 (0) | 2025.01.07 |
---|---|
Localization (1) | 2024.12.28 |
[ 부스트 캠프 ] 채팅 기능을 위한 웹소켓 만들기 (1) | 2024.11.30 |
[부스트 캠프] 우리만의 네트워크 만들기 (0) | 2024.11.27 |