Determine on iPhone if user has enabled push notifications
Data Structures & Algorithms practice on Codemia
Step through 300+ coding interview problems with animated visualisers that show the data structure changing as the code runs. The Blind 75 are free.
Introduction
To check whether a user has enabled push notifications on iOS, you use UNUserNotificationCenter.current().getNotificationSettings(). This async method returns a UNNotificationSettings object with an authorizationStatus property that tells you whether notifications are authorized, denied, provisional, or not yet requested. The approach differs between modern iOS (10+) and legacy versions, and you should always check status before attempting to send or schedule notifications.
Modern Approach: UNUserNotificationCenter (iOS 10+)
The callback runs on a background thread — dispatch to the main queue for UI updates:
Checking Individual Notification Types
Beyond the overall authorization, you can check specific delivery methods:
A user might have notifications authorized but alerts disabled — they would only receive badge updates.
Requesting Permission
If the status is .notDetermined, request permission:
Using async/await (iOS 15+)
Directing Users to Settings
Once a user denies notifications, you cannot re-prompt them. The only option is to direct them to the Settings app:
SwiftUI Integration
Legacy Approach (pre-iOS 10)
Common Pitfalls
- Checking status synchronously:
getNotificationSettingsis async. Calling it and immediately checking a flag before the callback runs gives stale results. Always use the completion handler orawait. - Confusing
.authorizedwith registered for remote:authorizationStatus == .authorizedmeans the user approved local and remote notification display. You still need to callregisterForRemoteNotifications()separately to get a device token for push. - Re-requesting after denial:
requestAuthorizationdoes nothing if the user already denied — it returnsfalseimmediately without showing a prompt. You must direct users to Settings. - Not rechecking on app foreground: Users can change notification settings at any time. Check status in
applicationDidBecomeActiveorsceneDidBecomeActiveto stay current. - Provisional notifications:
.provisionalmeans quiet delivery (notification center only, no alerts or sounds). Do not treat it the same as.authorizedfor features that rely on visible alerts.
Summary
- Use
UNUserNotificationCenter.current().getNotificationSettings()to check notification status (iOS 10+) - Check
authorizationStatusfor overall permission and individual settings (alerts, badges, sounds) for specific capabilities - Request permission only when status is
.notDetermined— denied users must go to Settings - Use
UIApplication.openSettingsURLStringto deep-link users to your app's Settings page - Recheck notification status on every app foreground since users can change settings at any time
- Use async/await on iOS 15+ for cleaner notification permission flows
Related reading
- Determining if an iPhone is Jail broken Programmatically
- Determining if Swift dictionary contains key and obtaining any of its values
- Developing for Android in Eclipse R.java not regenerating
- Developing for iOS device in Windows environment with Flutter
- Development team not showing in Xcode
- Dialog throwing Unable to add window — token null is not for an application” with getApplication as context
- Dialog with transparent background in Android
- didFailWithError Error DomainkCLErrorDomain Code0 The operation couldn’t be completed. kCLErrorDomain error 0.
.png&w=3840&q=75)
Tackling System Design Interview Problems
A short course that equips you with the skills to approach system design interviews methodically.
Start the free courseNo course covers this one yet
Basis Lab writes one for you from a sentence about what you want to be able to do, then teaches it and checks you understood. Your first course is free.
Build my courseData Structures & Algorithms practice on Codemia
Step through 300+ coding interview problems with animated visualisers that show the data structure changing as the code runs. The Blind 75 are free.