Bird
Raised Fist0
iOS Swiftmobile~5 mins

Analytics and Crashlytics in iOS Swift

Choose your learning style10 modes available
Introduction

Analytics helps you understand how people use your app. Crashlytics tells you when your app crashes and why. Together, they help make your app better and more reliable.

You want to see which screens users visit most in your app.
You want to know if users complete important actions like signing up or buying something.
You want to find and fix bugs that cause your app to crash.
You want to improve your app based on real user behavior.
You want to monitor app health after releasing updates.
Syntax
iOS Swift
import Firebase

// Log an event
Analytics.logEvent("event_name", parameters: ["key": "value"])

// Report a non-fatal error
Crashlytics.crashlytics().record(error: error)

Make sure to import Firebase to use Analytics and Crashlytics.

Events are logged with a name and optional parameters as key-value pairs.

Examples
This logs that the user viewed the Home screen.
iOS Swift
Analytics.logEvent("screen_view", parameters: ["screen_name": "Home"])
This logs a purchase event with item ID and price.
iOS Swift
Analytics.logEvent("purchase", parameters: ["item_id": "123", "price": 9.99])
This catches an error and reports it to Crashlytics without crashing the app.
iOS Swift
do {
  try someRiskyFunction()
} catch {
  Crashlytics.crashlytics().record(error: error)
}
Sample App

This simple app logs when the main screen is shown and when a purchase button is tapped. It also shows how to catch and report an error to Crashlytics without crashing the app.

iOS Swift
import UIKit
import Firebase

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    // Log screen view event
    Analytics.logEvent("screen_view", parameters: ["screen_name": "MainView"])
  }

  @IBAction func buyButtonTapped(_ sender: UIButton) {
    // Log purchase event
    Analytics.logEvent("purchase", parameters: ["item_id": "001", "price": 4.99])
  }

  func riskyOperation() {
    do {
      try performRiskyTask()
    } catch {
      // Report error to Crashlytics
      Crashlytics.crashlytics().record(error: error)
    }
  }

  func performRiskyTask() throws {
    // Simulate an error
    throw NSError(domain: "TestError", code: 1, userInfo: nil)
  }
}
OutputSuccess
Important Notes

Always test Analytics and Crashlytics on a real device, as simulators may not send data properly.

Use meaningful event names and parameters to get useful insights.

Crashlytics helps find crashes quickly, but also report non-fatal errors to catch issues early.

Summary

Analytics tracks user actions to help improve your app.

Crashlytics reports crashes and errors to keep your app stable.

Use both together to understand and fix problems in your app.

Practice

(1/5)
1. What is the main purpose of using Analytics in an iOS app?
easy
A. To track user actions and app usage patterns
B. To report app crashes and errors
C. To improve app performance by optimizing code
D. To manage app permissions and privacy settings

Solution

  1. Step 1: Understand Analytics role

    Analytics collects data about how users interact with the app, like button taps or screen views.
  2. Step 2: Differentiate from Crashlytics

    Crashlytics focuses on crash reports, not user behavior tracking.
  3. Final Answer:

    To track user actions and app usage patterns -> Option A
  4. Quick Check:

    Analytics = user action tracking [OK]
Hint: Analytics tracks usage; Crashlytics tracks crashes [OK]
Common Mistakes:
  • Confusing Analytics with Crashlytics
  • Thinking Analytics fixes crashes
  • Assuming Analytics manages permissions
2. Which Swift code snippet correctly logs a custom event named "purchase_complete" using Firebase Analytics?
easy
A. Analytics.logEvent("purchase_complete", parameters: [:])
B. Analytics.logEvent(purchase_complete, parameters: [:])
C. Analytics.logEvent("purchase_complete", parameters: "nil")
D. Analytics.logEvent('purchase_complete')

Solution

  1. Step 1: Check method signature

    The correct method requires event name as a string and parameters as a dictionary (can be empty).
  2. Step 2: Validate syntax correctness

    Analytics.logEvent("purchase_complete", parameters: [:]) uses a string event name and an empty dictionary, matching the required syntax.
  3. Final Answer:

    Analytics.logEvent("purchase_complete", parameters: [:]) -> Option A
  4. Quick Check:

    Correct syntax = Analytics.logEvent("purchase_complete", parameters: [:]) [OK]
Hint: Event name as string, parameters as dictionary [OK]
Common Mistakes:
  • Missing quotes around event name
  • Passing nil instead of dictionary
  • Omitting parameters argument
3. Given the following Swift code snippet using Crashlytics, what will happen when a crash occurs?
Crashlytics.crashlytics().log("User tapped buy button")
fatalError("Simulated crash")
medium
A. The app crashes but the log message is lost
B. The log message causes a runtime error
C. The app does not crash because log prevents it
D. The log message is sent to Crashlytics before the app crashes

Solution

  1. Step 1: Understand Crashlytics log behavior

    Calling log records a message that is sent to Crashlytics on next app launch after a crash.
  2. Step 2: Analyze crash trigger

    fatalError causes an immediate crash, but the log message is preserved for reporting.
  3. Final Answer:

    The log message is sent to Crashlytics before the app crashes -> Option D
  4. Quick Check:

    Crashlytics logs persist through crash [OK]
Hint: Crashlytics logs survive crashes for later reporting [OK]
Common Mistakes:
  • Assuming logs are lost on crash
  • Thinking log prevents crash
  • Confusing log with error throwing
4. You added Crashlytics to your app but crash reports are not showing up in the Firebase console. Which of these is the most likely cause?
medium
A. You used fatalError instead of assert
B. You forgot to call Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
C. You did not import UIKit in your Swift file
D. You called Analytics.logEvent instead of Crashlytics methods

Solution

  1. Step 1: Check Crashlytics setup requirements

    Crashlytics requires enabling data collection explicitly or via Info.plist to send crash reports.
  2. Step 2: Identify missing configuration

    Not calling setCrashlyticsCollectionEnabled(true) disables crash report sending.
  3. Final Answer:

    You forgot to call Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true) -> Option B
  4. Quick Check:

    Enable collection to send crash reports [OK]
Hint: Enable Crashlytics collection to receive reports [OK]
Common Mistakes:
  • Confusing Analytics logging with Crashlytics setup
  • Missing import statements
  • Thinking crash method choice affects reporting
5. You want to log a user property "user_level" with value "gold" in Firebase Analytics and also log a non-fatal error in Crashlytics when a payment fails. Which Swift code snippet correctly does both?
hard
A. Analytics.setUserProperty("user_level", forName: "gold") Crashlytics.crashlytics().record(error: Error("Payment failed"))
B. Analytics.logEvent("user_level", parameters: ["gold"]) Crashlytics.crashlytics().log("Payment failed")
C. Analytics.setUserProperty("gold", forName: "user_level") Crashlytics.crashlytics().record(error: NSError(domain: "Payment", code: 1, userInfo: nil))
D. Analytics.setUserProperty("gold", forName: "user_level") Crashlytics.crashlytics().log("Payment failed")

Solution

  1. Step 1: Set user property correctly

    Use setUserProperty(_:forName:) with value first, then property name.
  2. Step 2: Log non-fatal error properly

    Use record(error:) with an NSError instance to report non-fatal errors.
  3. Final Answer:

    Analytics.setUserProperty("gold", forName: "user_level") Crashlytics.crashlytics().record(error: NSError(domain: "Payment", code: 1, userInfo: nil)) -> Option C
  4. Quick Check:

    User property + non-fatal error = Analytics.setUserProperty("gold", forName: "user_level") Crashlytics.crashlytics().record(error: NSError(domain: "Payment", code: 1, userInfo: nil)) [OK]
Hint: User property value first, use record(error:) for non-fatal errors [OK]
Common Mistakes:
  • Swapping user property name and value
  • Using log() instead of record(error:) for errors
  • Passing wrong types to methods
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard