์๋ ํ์ธ์ Foma๐ ์ ๋๋ค!
์ค๋์ ์ฑ์ด ์ด๋์ ์ถฉ๋๋๋์ง ์ด๋์ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋์ง ๋ฑ์ ์์ธํ๊ฒ ์ค๋ช ํด์ฃผ๋
ํ์ด์ด๋ฒ ์ด์ค์ ํฌ๋์ฌ๋ฆฌํฑ์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฒ์ ๋ํด์ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์~
Crashlytics๋?
Firebase์์ Crashlytics๋ฅผ ์ด๋ ๊ฒ ์๊ฐํ๊ณ ์์ต๋๋ค.
"Firebase Crashlytics๋ ๊ฐ๋ฒผ์ด ์ค์๊ฐ ์ค๋ฅ ๋ณด๊ณ ๋๊ตฌ๋ก ์ฑ ํ์ง์ ์ ํํ๋ ์์ ์ฑ ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ณ ์ฐ์ ์์๋ฅผ ์ง์ ํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Crashlytics๋ ๋น์ ์ ์ข ๋ฃ๋ฅผ ์ง๋ฅ์ ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ ์ด๋ฌํ ๋น์ ์ ์ข ๋ฃ๋ฅผ ์ ๋ฐํ๋ ์ํฉ์ ๊ฐ์กฐํ์ฌ ๋ณด์ฌ์ฃผ๋ฏ๋ก ๋ฌธ์ ํด๊ฒฐ ์๊ฐ์ด ์ ์ฝ๋ฉ๋๋ค.
ํน์ ๋น์ ์ ์ข ๋ฃ๊ฐ ์ฌ๋ฌ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๋์ง ํ์ธํด ๋ณด์ธ์. ๋ฌธ์ ์ ์ฌ๊ฐ๋๊ฐ ๊ธ๊ฒฉํ ์ฆ๊ฐํ๋ฉด ์๋ฆผ์ด ์ ์ก๋ฉ๋๋ค. ์ด๋ค ์ฝ๋ ์ค์ด ๋น์ ์ ์ข ๋ฃ๋ฅผ ์ผ์ผํค๋์ง ํ์ ํ ์ ์์ต๋๋ค."
์ฆ, ํฌ๋์ฌ๋ฆฌํฑ์ค๋ ์ ์ ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋์์ ๋ ๊ฐ๋ฐ์์๊ฒ ์๋ ค์ฃผ๋ ์ค๋ฅ ๋ณด๊ณ ๋๊ตฌ์ ๋๋ค.
Crashlytics ์ฌ์ฉํ๊ธฐ
๋จผ์ Firebase ์ฝ์๋ก ์ด๋ํด์ Crashlytics ํญ์ ๋๋ฌ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค ํด๋น ์ฑ์ ๊ณจ๋ผ์ฃผ์ ๋ค Crashlytics ์ฌ์ฉ ์ค์ ์ ๋๋ฌ์ค๋๋ค.
Podfile
ํํ์ผ์ Analytics์ Crashlytics๋ฅผ ๋ชจ๋ ์ถ๊ฐํด์ค๋๋ค.
(Crashlytics ์ฌ์ฉ ํ๊ฒฝ์ ์ต์ ํํ๋ ค๋ฉด Firebase ํ๋ก์ ํธ์์ Google ์ ๋๋ฆฌํฑ์ค๋ฅผ ์ฌ์ฉ ์ค์ ํ๊ณ Google ์ ๋๋ฆฌํฑ์ค์ฉ Firebase pod๋ฅผ ์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
pod 'Firebase/Analytics'
pod 'Firebase/Crashlytics'
๊ทธ๋ฆฌ๊ณค ํด๋น ํ๋ก์ ํธ๋ก ์ด๋ํด์ ํ์ ์ค์นํด์ค๋๋ค.
pod install
Xcode
์ด์ Xcode ํด๋น ํ๋ก์ ํธ๋ก ์ด๋ํ์ ์ Target - Build Settings - Debug Information Format ์ผ๋ก ์ด๋ํด์ค๋๋ค.
์ด๋ํ์ ๋ค Debug,Release ๋ชจ๋ DWARF with dSYM File๋ก ๋ฐ๊ฟ์ฃผ์ธ์.
์ด์ Build Phases๋ฅผ ์ด๋ํ์ ๋ค ์ผ์ชฝ ์๋จ +๋ฒํผ์ ๋๋ฌ์ ์๋ก์ด Run Script Phase๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
์ฌ๊ธฐ์ ์๋์ ๊ฐ์ด ๋ฃ์ด์ฃผ์ธ์.
"${PODS_ROOT}/FirebaseCrashlytics/run"
"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp "${PROJECT_DIR}/GoogleService-Info.plist" -p ios "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
Run Script ์๋ input files์ ์๋์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ์ฌ ๋ฃ์ด์ฃผ์ธ์.
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
AppDelegate
์ฑ ๋๋ฆฌ๊ฒ์ดํธ์ Firebase๋ฅผ import ํด์ค๋๋ค.
import Firebase
didFinishLaunchingWithOptions ๋ฉ์๋์ FirebaseApp.configure() ๋ฅผ ์คํ์์ผ์ค๋๋ค.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
...
Test
์๋ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ด Crash ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ฐ์ ๋ก ๋น์ ์ ์ข ๋ฃ๋๋๋ก ํฉ๋๋ค.
let button = UIButton(type: .roundedRect)
button.frame = CGRect(x: 20, y: 50, width: 100, height: 30)
button.setTitle("Crash", for: [])
button.addTarget(self, action: #selector(self.crashButtonTapped(_:)), for: .touchUpInside)
view.addSubview(button)
@IBAction func crashButtonTapped(_ sender: AnyObject) {
fatalError()
}
Fireabse Console
์ด์ ํ์ด์ด๋ฒ ์ด์ค ์ฝ์์ Crashlytics๋ก ์ด๋ํด์ ๋์ฌ๋ณด๋๋ฅผ ํ์ธํ๋ ค๊ณ ํ๋๋...
(ํ 10๋ถ์ ๋ ๊ธฐ๋ค๋ฆฐ๊ฑฐ ๊ฐ์์)
์๋์ ๊ฐ์ด dSYM์ด ๋๋ฝ๋์๋ค๊ณ ํ๋๋ผ๊ตฌ์...
(์ด๊ฒ ์๋์ผ๋ก ์์ฌ๋ผ๊ฐ ๋๊ฐ ์์ด์ ์๋์ผ๋ก ์ฌ๋ ค์ค์ผ ํ ๋๊ฐ ์๋ค๋ค์..)
App Store Connect์ TestFlight๋ก ์ด๋ํด์ค๋๋ค.
์ฐ์ธก ํ๋จ์ dSYM ๋ค์ด๋ก๋๊ฐ ์์๊ฑฐ์์.
๋ค์ด๋ฐ์ ์ค๋๋ค.
Terminal
ํฐ๋ฏธ๋๋ก ์ด๋ํด์ ํด๋น ํ๋ก์ ํธ๋ก ์ด๋ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณค Pods/FirebaseCrashlytics/upload-symbols -gsp "GoogleService-Info.plist๊ฐ ์๋ ๊ฒฝ๋ก" -p ios "appDsyms๊ฐ ์๋ ๊ฒฝ๋ก"๋ฅผ ์ ์ด์ค๋๋ค.
(๊ฒฝ๋ก๋ ํด๋์ ์๋ ํ์ผ์ ๊ฐ์ ธ๋ค ๋๋ฉด ์๋์ผ๋ก ์ ๋ ฅ๋ฉ๋๋ค.)
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด Successfully uploaded Crashlytics symbols๋ผ๊ณ ๋ฐ๊ฑฐ์์.
์คํ ์ค๋ฒ ํ๋ก์ฐ๋ ๊นํ ํ ๋ก ์ ๊ตฌ๊ธ๋ง ํด์ ์ด๋ ๊ฒ ํ๊ณ ๋ฉฐ์น ์ด ์ง๋์ผ ๋๋ค๊ณ ํ๋๋ผ๊ตฌ์..
dSYM์ด ์ ๋ก๋ ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค ๋ณด๊ฒ ์ต๋๋ค!
ํน์๋ผ๋ ํด๊ฒฐ๋ฒ์ ์์๋ ๋ถ์ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์
8์ 19์ผ ์์
ํ ์ผ์ฃผ์ผ์ด ์ง๋๋ ํด๊ฒฐ์ด ์๋๊ธธ๋ ๋ด๊ฐ ๋ญ ์๋ชปํ๋๋ณด๋คํ๊ณ ๊น๋จน์๋ค๊ฐ
์ฐ์ฐํ ํ 10์ผ์ฏค ์ง๋ ์ค๋ ๋ค์ด๊ฐ๋ณด๋ ํด๊ฒฐ์ด ๋์ด์์๋ค.... ๊ทธ๋ฅ ๊ธฐ๋ค๋ฆฌ๋ฉด ๋๊ตฌ๋..
ํ์ธํด๋ณด๋ ๋น์ ์ ์ข ๋ฃ์ ๋ํ ์ ๋ณด๋ฅผ ์์ธํ ์๋ ค์คฌ์ต๋๋ค.
- ๋ฒ์ ์ ๋ณด
- ์ํฅ์ ๋ฐ์ ์ฌ์ฉ์ ์
- ์ฌ๊ฐํจ ์ ๋
- ์ปจํธ๋กค๋ฌ ์ ๋ณด
- ์ค
- ๋ฉ์๋
๋ํ ๋ฌธ์ ๋ฅผ ํด๋ฆญํด์ ๋ค์ด๊ฐ๋ณด๋ฉด ๋น์ ์ ์ข ๋ฃ๋๋ ์ฐ๋ ๋ ์คํ, ๋๋ฐ์ด์ค ์ ๋ณด๊น์ง ์๋ ค์คฌ์ต๋๋ค.
์ด๋ ๊ฒ ์์ธํ ์ ๋ณด๋ฅผ ๋ณด๋ ํฌ๋์ฌ๊ฐ ์ผ๋ง๋ ์ผ์ด๋๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ ์ง ์ ์ฉํ๋๋ผ๊ตฌ์.
ํน์๋ผ๋ ๊ถ๊ธํ์ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
Reference
๋๊ธ