์๋ ํ์ธ์!
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 ๊ตฌ์ฑ ํ์ผ์ ์ ์ฅํ ๋์๋ ํ์ผ๋ช ์ ๋ค๋ฅด๊ฒ ๋ง๋ค๊ณ ๊ตฌ๋ถํ๊ฑฐ๋, ํ์ผ๋ช ์ ๊ฐ๊ฒ ํ๊ณ ํด๋๋ก ๊ตฌ๋ถํด๋ ๋ฉ๋๋ค. ์ ๋ ํ์์ ๋ฐฉ๋ฒ์ ํํ์ด์!

์ฑ์ด ๋น๋๋ ๋ ํ๊ฒฝ์ ๋ง๋ ํ์ผ์ ์ฐธ์กฐํ๋๋ก 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 ๋ฅผ ์ด์ฉํด์ ํ๋ก์ ํธ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ
- [LET me lOg] Multiple Firebase Configuration ์ค์ ํ๊ธฐ
- [Hanulyun] Google-Service-Info.plist ํ์ผ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ๊ธฐ