Bird
Raised Fist0
iOS Swiftmobile~20 mins

Local notifications in iOS Swift - Mini App: Build & Ship

Choose your learning style10 modes available
Build: Notification Scheduler
This screen lets users schedule a local notification that will appear after 5 seconds when they tap a button.
Target UI
-------------------------
| Notification Scheduler |
-------------------------
|                       |
|   [ Schedule Alert ]   |
|                       |
-------------------------
Add a button labeled 'Schedule Alert' centered on the screen.
When tapped, request notification permission if not already granted.
Schedule a local notification to appear after 5 seconds with title 'Reminder' and body 'This is your local notification!'.
Handle permission denial gracefully by showing an alert.
Use UserNotifications framework.
Starter Code
iOS Swift
import SwiftUI
import UserNotifications

struct ContentView: View {
    var body: some View {
        VStack {
            // TODO: Add Schedule Alert button here
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.white)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Task 1
Task 2
Task 3
Task 4
Solution
iOS Swift
import SwiftUI
import UserNotifications

struct ContentView: View {
    @State private var showingPermissionAlert = false
    @State private var alertMessage = ""

    var body: some View {
        VStack {
            Button("Schedule Alert") {
                scheduleNotification()
            }
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(8)
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .background(Color.white)
        .alert(isPresented: $showingPermissionAlert) {
            Alert(title: Text("Notification Permission"), message: Text(alertMessage), dismissButton: .default(Text("OK")))
        }
    }

    func scheduleNotification() {
        let center = UNUserNotificationCenter.current()
        center.getNotificationSettings { settings in
            switch settings.authorizationStatus {
            case .notDetermined:
                center.requestAuthorization(options: [.alert, .sound]) { granted, error in
                    DispatchQueue.main.async {
                        if granted {
                            sendNotification()
                        } else {
                            alertMessage = "Permission was denied. Please enable notifications in settings."
                            showingPermissionAlert = true
                        }
                    }
                }
            case .authorized, .provisional:
                DispatchQueue.main.async {
                    sendNotification()
                }
            case .denied:
                DispatchQueue.main.async {
                    alertMessage = "Permission was denied. Please enable notifications in settings."
                    showingPermissionAlert = true
                }
            default:
                break
            }
        }
    }

    func sendNotification() {
        let content = UNMutableNotificationContent()
        content.title = "Reminder"
        content.body = "This is your local notification!"
        content.sound = UNNotificationSound.default

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request) { error in
            if let error = error {
                DispatchQueue.main.async {
                    alertMessage = "Failed to schedule notification: \(error.localizedDescription)"
                    showingPermissionAlert = true
                }
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

This solution uses SwiftUI and the UserNotifications framework to schedule a local notification.

The button labeled Schedule Alert triggers scheduleNotification(). This function first checks the current notification permission status.

If permission is not determined, it requests authorization. If granted, it schedules the notification; if denied, it shows an alert.

If permission is already authorized or provisional, it schedules the notification immediately.

If permission is denied, it shows an alert informing the user.

The notification is set to fire after 5 seconds with a title and body as required.

Alerts are shown using SwiftUI's .alert modifier bound to state variables.

Final Result
Completed Screen
-------------------------
| Notification Scheduler |
-------------------------
|                       |
|   [ Schedule Alert ]   |
|                       |
-------------------------
User taps 'Schedule Alert' button.
App requests notification permission if not granted.
If permission granted, a notification appears after 5 seconds with title 'Reminder' and body 'This is your local notification!'.
If permission denied, an alert pops up explaining the denial.
Stretch Goal
Add a toggle to enable or disable notifications and save the preference.
💡 Hint
Use @AppStorage to save the toggle state and check it before scheduling notifications.

Practice

(1/5)
1. What is the first step you must do before scheduling local notifications in an iOS app?
easy
A. Request permission from the user to send notifications
B. Create the notification content
C. Set up the notification trigger
D. Register the notification category

Solution

  1. Step 1: Understand user permission requirement

    iOS requires apps to ask users for permission before sending notifications to respect privacy.
  2. Step 2: Request permission before scheduling

    You must call the requestAuthorization method to get user consent before scheduling any notifications.
  3. Final Answer:

    Request permission from the user to send notifications -> Option A
  4. Quick Check:

    Permission request = Request permission from the user to send notifications [OK]
Hint: Always ask user permission first before notifications [OK]
Common Mistakes:
  • Scheduling notifications without permission
  • Assuming notifications work without user consent
  • Skipping the requestAuthorization call
2. Which of the following is the correct way to create a notification content in Swift?
easy
A. let content = UNNotificationContent()
B. let content = NotificationContent()
C. let content = UNMutableNotificationContent()
D. let content = UNNotificationRequest()

Solution

  1. Step 1: Identify the correct class for notification content

    UNMutableNotificationContent is the class used to create and customize notification content.
  2. Step 2: Differentiate from other classes

    UNNotificationContent is abstract and cannot be instantiated; UNNotificationRequest is for scheduling, not content.
  3. Final Answer:

    let content = UNMutableNotificationContent() -> Option C
  4. Quick Check:

    Use UNMutableNotificationContent() to create content [OK]
Hint: Use UNMutableNotificationContent() to create notification content [OK]
Common Mistakes:
  • Trying to instantiate UNNotificationContent directly
  • Confusing UNNotificationRequest with content
  • Using wrong class names
3. What will happen when this Swift code runs?
let content = UNMutableNotificationContent()
content.title = "Reminder"
content.body = "Time to drink water"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(identifier: "waterReminder", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
medium
A. A notification appears after 5 seconds with the given title and body
B. A notification titled 'Reminder' appears immediately
C. The notification repeats every 5 seconds
D. No notification appears because repeats is false

Solution

  1. Step 1: Analyze the trigger setup

    The trigger is set with timeInterval 5 seconds and repeats false, so it fires once after 5 seconds.
  2. Step 2: Understand notification scheduling

    The request is added to the notification center, so the notification will appear after the delay with the specified title and body.
  3. Final Answer:

    A notification appears after 5 seconds with the given title and body -> Option A
  4. Quick Check:

    TimeInterval trigger fires once after delay = A notification appears after 5 seconds with the given title and body [OK]
Hint: TimeInterval triggers fire after delay, repeats false means one-time [OK]
Common Mistakes:
  • Thinking repeats false means no notification
  • Assuming notification appears immediately
  • Confusing repeats true with repeats false behavior
4. Identify the error in this Swift code for scheduling a local notification:
let content = UNMutableNotificationContent()
content.title = "Alert"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: -10, repeats: false)
let request = UNNotificationRequest(identifier: "alert1", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
medium
A. Missing requestAuthorization call before scheduling
B. Negative timeInterval causes an error; timeInterval must be positive
C. content.title should be content.body
D. UNNotificationRequest identifier must be unique

Solution

  1. Step 1: Check the trigger timeInterval value

    The timeInterval is set to -10, which is invalid because it must be positive.
  2. Step 2: Understand trigger constraints

    UNTimeIntervalNotificationTrigger requires a positive timeInterval to schedule the notification correctly.
  3. Final Answer:

    Negative timeInterval causes an error; timeInterval must be positive -> Option B
  4. Quick Check:

    timeInterval > 0 required = Negative timeInterval causes an error; timeInterval must be positive [OK]
Hint: timeInterval must be positive for triggers [OK]
Common Mistakes:
  • Using negative or zero timeInterval
  • Ignoring permission request (though important, not error here)
  • Confusing title and body properties
5. You want to schedule a daily local notification at 8:00 AM that repeats every day. Which trigger setup is correct in Swift?
hard
A. UNTimeIntervalNotificationTrigger(timeInterval: 86400, repeats: true)
B. UNTimeIntervalNotificationTrigger(timeInterval: 3600, repeats: true)
C. UNCalendarNotificationTrigger(dateMatching: DateComponents(hour: 8, minute: 0), repeats: false)
D. UNCalendarNotificationTrigger(dateMatching: DateComponents(hour: 8, minute: 0), repeats: true)

Solution

  1. Step 1: Understand daily repeating notification needs

    To trigger at a specific time daily, use UNCalendarNotificationTrigger with repeats true and matching hour and minute.
  2. Step 2: Compare options

    UNTimeIntervalNotificationTrigger(timeInterval: 86400, repeats: true) repeats every 86400 seconds but may drift; UNCalendarNotificationTrigger(dateMatching: DateComponents(hour: 8, minute: 0), repeats: true) correctly uses calendar components for 8:00 AM daily; UNCalendarNotificationTrigger(dateMatching: DateComponents(hour: 8, minute: 0), repeats: false) does not repeat; UNTimeIntervalNotificationTrigger(timeInterval: 3600, repeats: true) repeats every hour, not daily.
  3. Final Answer:

    UNCalendarNotificationTrigger(dateMatching: DateComponents(hour: 8, minute: 0), repeats: true) -> Option D
  4. Quick Check:

    Use calendar trigger with repeats true for daily time [OK]
Hint: Use calendar trigger with repeats true for daily notifications [OK]
Common Mistakes:
  • Using time interval triggers for exact daily time
  • Setting repeats false for repeating notifications
  • Confusing seconds with hours in timeInterval
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