๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ 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