Firebase Crashlytics
จากที่ Fabric said Goodbye ไปเมื่อ 4 May ยังไม่มีเวลามาดู Crash report ตัวอื่นเลย พอมีเวลานิดหน่อยเลยมาลองเล่น Firebase Crashlytics พอขึ้นชื่อด้วย Firebase แล้วไม่มี Mobile developer คนไหนไม่เคยใช้แน่ ๆ เนื่องจากมี Product ออกมาให้เลือกใช้กันแบบไม่ขาดสาย ทั้งฟรีและเสียเงิน และยังสามารถ Integrate กับระบบอื่น ๆ ได้อีกด้วย
ทำไมเราถึงต้องใช้ Crash report อย่าง Firebase Crashlytics ก็เพราะว่าโปรแกรมหรือแอปเราอาจจะมี Bug ที่หลุดลอดจากมือเราไปได้ทั้ง ๆ ที่เราก็ทำ Unit Test แล้ว เคยไหมเวลาที่เราเล่นไม่เจอปัญหาแต่พอถึงมือคนอื่นอย่าง Tester, SA หรือลูกค้า แอปมักจะทำงานไม่ค่อยปกติ ร้ายไปกว่านั้นแอปดันเด้งออกไปเลย (App Crash) ซึ่งมาถามว่าแอปจังหวะไหนบ้างก็อธิบายได้บ้างไม่ได้บ้าง เราจึงต้องให้ Crash report เป็นคนแจ้งเราพร้อมรายละเอียดของปัญหาและ device info ต่าง ๆ
ก่อนอื่นเลยให้สร้าง Firebase project ขึ้นมาก่อน
จากนั้นกดที่ Platform ที่ต้องการ ตัวอย่างนี้จะกดที่ iOS และกรอก Bundle ID ของแอปเราตามรูปด้านล่าง
จากนั้นให้กด Download “GoogleService-Info.plist” และเอาไปไว้ที่ Project ดังรูป
จากนั้นให้กดเข้าไปที่เมนู “Crashlytics” ใน section ของ Quality จากนั้นกด Add SDK
ระหว่างรอ Add SDK ให้เรา install library เข้ามาใช้งานใน project ก่อนดังคำสั่งด้านล่าง
$ pod init
จะได้ Podfile ให้เราทำงานเพิ่ม library ดังตัวอย่าง
platform :ios, ‘10.0’
use_frameworks!target ‘FBCrashlytics’ do
pod ‘Firebase/Crashlytics’
pod ‘Firebase/Analytics’
end
จากนั้น install ได้เลย
$ pod install
เมื่อเสร็จแล้วจะได้ดังรูปด้านล่าง
จากนั้นเราจะมา Setup project กันให้เปิดเข้าไปที่ “.workspace” จากนั้นให้เข้าไปที่ AppDelegate.swift
import Firebase
แล้วทำการ config Firebase ด้วยคำสั่งด้านล่างใน “didFinishLaunchingWithOptions”
FirebaseApp.configure()
จากนั้นมา Initialize Crashlytics กัน ให้เข้าไปที่ Build Phases และกดเลือก New Run Script Phase ดังรูป
จากนั้นใส่คำสั่งเข้าไปดังรูป
"${PODS_ROOT}/FirebaseCrashlytics/run"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
จากนั้นทดลองรันแอปเมื่อเสร็จแล้วให้ไป Refresh หน้าเว็บจะขึ้นดังรูป
มาทดสอบ Forcing a crash กันให้เพิ่มด้านล่างเข้าไปใน ViewController ของเรา
override func viewDidLoad() {
super.viewDidLoad() 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()
}
จากนั้นให้เราไป Setup project เพิ่มเติมดังรูปให้ Debug เป็น “DWARF with dSYM File”
** ทีนี้เราสามารถทดสอบโดยรันผ่าน iOS Simulator ได้แล้ว แต่ถ้ายังไม่ได้ให้เปลี่ยน Debug เป็น Release mode ดังรูป
เตรียมเสร็จแล้วมาทำให้ App Crash กันโดย Step ดังนี้
- กดปุ่ม “Run”
- กดปุ่ม “Stop”
- กดแอปบน Simulator
- กดปุ่ม “Crash”
จากนั้นจะมี Crash report แจ้งขึ้นมาภายใน 5 นาทีดังรูป
พอกดเข้าไปดูจะเห็น Stack trace ดังรูป
หน้านี้จะแสดงรายละเอียด Crash พร้อม Device info ต่าง ๆ ดังรูป พอ dev เห็นแล้วนี่หวานเลย แก้ไข Bug ได้แบบง่าย ๆ เลย เมื่อเราแก้ไข Bug เรียบร้อยแล้วให้กด Close จากนั้นจะขึ้นดังรูป
กรณีที่ Crashlytics error และ Required dSYMs จะเห็นดังรูป
ให้เราหาไฟล์ dSYMs หรือเอา UUID ไป search ก็ได้จากนั้นให้ Upload ขึ้น Crashlytics ด้วยคำสั่งด้านล่างบน Terminal
$ Pods/FirebaseCrashlytics/upload-symbols -gsp FBCrashlytics/GoogleService-Info.plist -p ios ./
จะเห็นได้ว่า upload-symbols เป็น Tool ตัวหนึ่งที่ติดมากับ FirebaseCrashlytics ที่เรา Install ผ่าน CocoaPods เมื่อ Upload เสร็จแล้วจะขึ้นดังรูปด้านล่าง
เท่านี้เราก็จะสามารถดู Crash ของแอปเราได้ปกติแล้ว
Blog ถัดไปจะมาเขียนเกี่ยวกับการทำ Crash alert เพื่อให้ Crashlytics แจ้งผลเราแบบ Realtime กัน