| 12345678910111213141516171819202122232425262728293031 |
- // LoopFollow
- // NotificationAuthorization.swift
- import UserNotifications
- /// Requests notification authorization lazily, the first time the user opts into
- /// a feature that needs it (alarms). This keeps the system prompt off the very
- /// first launch so it doesn't front the onboarding flow.
- enum NotificationAuthorization {
- /// Asks for authorization only when the user hasn't decided yet. Safe to call
- /// repeatedly — it's a no-op once the status is determined. `completion` runs
- /// on the main queue after the prompt is dismissed (or immediately when the
- /// status was already determined), so a caller can wait for the system prompt
- /// before moving on.
- static func requestIfNeeded(completion: @escaping () -> Void = {}) {
- let center = UNUserNotificationCenter.current()
- center.getNotificationSettings { settings in
- guard settings.authorizationStatus == .notDetermined else {
- DispatchQueue.main.async { completion() }
- return
- }
- center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in
- if !granted {
- LogManager.shared.log(category: .general, message: "User has declined notifications")
- }
- DispatchQueue.main.async { completion() }
- }
- }
- }
- }
|