λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS

[iOS/Swift] κ°œλ°œν™˜κ²½ Debug/Release κ΅¬λΆ„ν•˜κΈ° + Firebase Crashlytics μ„€μ •

by Danna 2021. 5. 23.
728x90
728x90

μ•ˆλ…•ν•˜μ„Έμš”!

iOS μ•±μ˜ κ°œλ°œμ„ μ™„λ£Œν•œ ν›„, μ•± μŠ€ν† μ–΄μ— λŸ°μΉ­ν•˜κΈ° 전에 Debug / Release ν™˜κ²½μ„ κ΅¬λΆ„ν•΄μ„œ κ°œλ°œμ„œλ²„μ™€ μ‹€μ„œλ²„ 각각 ν…ŒμŠ€νŠΈ ν›„ 배포λ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€. API μ„œλ²„μ™€ Firebase (Auth, Storage, Crashlytics) λ₯Ό μ—°λ™ν–ˆκΈ° λ•Œλ¬Έμ—, μ’€ 더 λ³΅μž‘ν•΄μ„œ κ³ μƒν–ˆλ˜ 기얡이 λ‚˜λ„€μš” πŸ˜…

  • Debug ν™˜κ²½ (Dev) - 개발용 μ„œλ²„, DB, Firebase ν”„λ‘œμ νŠΈ
  • Release ν™˜κ²½ (Production) - μ‹€μ œ μ„œλΉ„μŠ€μš© μ„œλ²„, DB, Firebase ν”„λ‘œμ νŠΈ 

μ•„λž˜ λ‚΄μš©λ“€μ— 따라 Xcode μ—μ„œ 개발 ν™˜κ²½μ„ κ΅¬λΆ„ν–ˆμŠ΅λ‹ˆλ‹€.

1. 개발 μ„œλ²„, μ‹€ μ„œλ²„ URL κ΅¬λΆ„ν•˜κΈ°

2. 두 개의 Firebase ν”„λ‘œμ νŠΈλ₯Ό DEBUG/RELASE 에 따라 κ΅¬λΆ„ν•˜κΈ°

3. Firebase ν”„λ‘œμ νŠΈ URL κ΅¬λΆ„ν•˜κΈ°

4. Firebase Crashlytics μΆ”κ°€ν•˜κΈ°


1. 개발 μ„œλ²„, μ‹€ μ„œλ²„ URL κ΅¬λΆ„ν•˜κΈ°

API μ„œλ²„μ™€ ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ URL κ΄€λ ¨λœ 정보λ₯Ό μ €μž₯ν•œ ꡬ쑰체에 μƒμˆ˜λ‘œ baseURL 값을 μ„€μ •ν•΄μ£Όκ³  μžˆλŠ”λ°μš”. ν•΄λ‹Ή 값을 DEBUG ν™˜κ²½, RELEASE ν™˜κ²½μ— 따라 λ‹€λ₯Έ 값이 μ„€μ •λ˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

#if DEBUG
    static let baseURL = "개발용 API μ„œλ²„ URL"
#else
    static let baseURL = "μ‹€μ„œλΉ„μŠ€ API μ„œλ²„ URL"
#endif

 

2. 두 개의 Firebase ν”„λ‘œμ νŠΈλ₯Ό DEBUG/RELASE 에 따라 κ΅¬λΆ„ν•˜κΈ°

API μ„œλ²„μ™€ λ”λΆˆμ–΄ Firebase κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³  μžˆλŠ”λ°μš”. Firebase ν”„λ‘œμ νŠΈλ„ 개발용 / μ‹€μ„œλΉ„μŠ€μš© 두 개둜 ꡬ뢄을 ν•΄μ„œ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

 

Firebase ν”„λ‘œμ νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” ꡬ성 파일인 GoogleService-Info.plist λ₯Ό ν”„λ‘œμ νŠΈ 내에 μ €μž₯ν•˜κ³  μžˆμ–΄μ•Όν•©λ‹ˆλ‹€. 두 개의 ν”„λ‘œμ νŠΈλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 각 ν”„λ‘œμ νŠΈλ§ˆλ‹€ ꡬ성 νŒŒμΌμ„ 가지고 μžˆμ–΄μ•Όν•˜κ³ , 앱이 λΉŒλ“œλ  λ•Œ ν™˜κ²½μ— λ§žλŠ” νŒŒμΌμ„ μ°Έμ‘°ν•˜λ„λ‘ ν•˜λ©΄ λ©λ‹ˆλ‹€.

Firebase λ¬Έμ„œ [μ—¬λŸ¬ ν”„λ‘œμ νŠΈ ꡬ성]
ꡬ성 νŒŒμΌμ€ iOS의 경우 GoogleService-Info.plist, Android의 경우 google-services.jsonμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŒŒμΌμ„ μ˜΅μ…˜ 객체(FIROption λ˜λŠ” FirebaseOptions)둜 읽으면 Firebase μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 객체(FIRApp λ˜λŠ” FirebaseApp)κ°€ 이 μ˜΅μ…˜ 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.

 

 

Firebase ꡬ성 νŒŒμΌμ„ μ €μž₯ν•  λ•Œμ—λŠ” νŒŒμΌλͺ…을 λ‹€λ₯΄κ²Œ λ§Œλ“€κ³  κ΅¬λΆ„ν•˜κ±°λ‚˜, 파일λͺ…을 κ°™κ²Œ ν•˜κ³  ν΄λ”λ‘œ ꡬ뢄해도 λ©λ‹ˆλ‹€. μ €λŠ” ν›„μžμ˜ 방법을 νƒν–ˆμ–΄μš”!

Firebase multiple project

앱이 λΉŒλ“œλ  λ•Œ ν™˜κ²½μ— λ§žλŠ” νŒŒμΌμ„ μ°Έμ‘°ν•˜λ„λ‘ Build Phases μ—μ„œ 슀크립트λ₯Ό μΆ”κ°€ν•΄μ€λ‹ˆλ‹€. μ•„λž˜ μŠ€ν¬λ¦½νŠΈλŠ” Debug / Release ν™˜κ²½μ— 따라 Firebase κ΅¬μ„± νŒŒμΌμ„ ν”„λ‘œμ νŠΈμ˜ 루트 폴더에 볡사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€!

# Type a script or drag a script file from your workspace to insert its path.
case "${CONFIGURATION}" in
  "Debug" )
cp -r "$SRCROOT/Zerobin/FirebaseConfig/Dev/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;
  "Release" )
cp -r "$SRCROOT/Zerobin/FirebaseConfig/Main/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;
*)
;;
esac

 

3. Firebase ν”„λ‘œμ νŠΈ URL κ΅¬λΆ„ν•˜κΈ°

ν˜„μž¬ μ•±μ—μ„œλŠ” Firebase Storage λ₯Ό 톡해 이미지λ₯Ό κ΄€λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ 라이브러리λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄ Firebase URL 을 톡해 이미지λ₯Ό μ ‘κ·Όν•˜λŠ” κ²½μš°λ„ μžˆμ–΄, URL 도 λ‘κ°œμ˜ ν”„λ‘œμ νŠΈλ₯Ό κ΅¬λΆ„ν•΄μ€˜μ•Ό ν–ˆμ–΄μš”.

 

Firebase Storage 에 μ €μž₯된 파일의 URL 은 μ•„λž˜μ²˜λŸΌ κ΅¬λΆ„λΌμš”.

"https://firebasestorage.googleapis.com/v0/b/\(projectID).appspot.com/o/\(fileName)?alt=media"

 

1λ²ˆμ—μ„œ κ°œλ°œμ„œλ²„, μ‹€μ„œλ²„μ˜ URL 을 κ΅¬λΆ„ν•˜λŠ” 것과 λΉ„μŠ·ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€! baseURL κ³Ό query 사이에 파일 이름을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œ 각각 μƒμˆ˜μ— ν• λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

#if DEBUG
    static let projectId = "κ°œλ°œν”„λ‘œμ νŠΈID"
#else
    static let projectId = "μ‹€μ„œλΉ„μŠ€ν”„λ‘œμ νŠΈID"
#endif

static let baseURL = "https://firebasestorage.googleapis.com/v0/b/\(projectId).appspot.com/o/"
static let query = "?alt=media"

 

4. Firebase Crashlytics μΆ”κ°€ν•˜κΈ°

iOS μ•±μ˜ ν¬λž˜μ‰¬(비정상 μ’…λ£Œ)λ₯Ό μˆ˜μ§‘ν•˜κΈ° μœ„ν•΄μ„œ Firebase Crashlytics κΈ°λŠ₯을 μ—°λ™ν–ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή κΈ°λŠ₯은 Debug λͺ¨λ“œμ—μ„œλŠ” μ΄μš©λ˜μ§€ μ•Šκ³ , Release λͺ¨λ“œμ—μ„œλ§Œ 이용이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μ‹œμž‘ν•˜λŠ” 방법에 λŒ€ν•΄μ„œλŠ” Firebase λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”!

 

Build Phase 에 μ•„λž˜ 슀크립트λ₯Ό μΆ”κ°€ν•΄μ€λ‹ˆλ‹€. 2λ²ˆμ—μ„œ μƒμ„±ν•œ μŠ€ν¬λ¦½νŠΈκ°€ μ‹€ν–‰λœ 이후에 싀행될 수 μžˆλ„λ‘ μˆœμ„œλ₯Ό μ„€μ •ν•΄μ£Όμ„Έμš”. 

# Type a script or drag a script file from your workspace to insert its path.
if [ "${CONFIGURATION}" != "Debug" ]; then
    "${PODS_ROOT}/FirebaseCrashlytics/run"
    "${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist -p ios ${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
fi

이후, 앱을 κ°•μ œ μ’…λ£Œν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ„œ Crashlytics κ°€ 잘 μž‘λ™λ˜λŠ”μ§€ ν™•μΈν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€. (μ½”λ“œλŠ” κΌ­ μ œκ±°ν•΄μ£Όμ„Έμš”!!)


πŸ‘£ μ°Έκ³  링크

2개 μ΄μƒμ˜ 개발 ν™˜κ²½μ„ κ΅¬λΆ„ν•˜λŠ” 방법

Firebase Crashlytics λ₯Ό μ΄μš©ν•΄μ„œ ν”„λ‘œμ νŠΈ κ΅¬λΆ„ν•˜λŠ” 방법

 

728x90
728x90