skip to Main Content

I would like to request notification permission from the user on startup without forcing the user to click a specific button.
Xcode 14.2

My application structure:

import SwiftUI
import UserNotifications


@main
struct RSApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
            
        }
    }
}

Now where should I add this code to request permission?

center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
    
    if let error = error {
        // Handle the error here.
    }
    // Enable or disable features based on the authorization.
}

(from https://developer.apple.com/documentation/usernotifications/asking_permission_to_use_notifications)

I know I can add it as a function call to the button, but I would like to request access without the user having to click anything, so basically when the view is initialized.

2

Answers


  1. Chosen as BEST ANSWER

    This is easy:

    import SwiftUI
    import UserNotifications
    
    
    @main
    struct RSApp: App {
        let center = UNUserNotificationCenter.current()
        
        init() {
            registerForNotification()
        }
        
        func registerForNotification() {
            //For device token and push notifications.
            UIApplication.shared.registerForRemoteNotifications()
            
            let center : UNUserNotificationCenter = UNUserNotificationCenter.current()
            //        center.delegate = self
            
            center.requestAuthorization(options: [.sound , .alert , .badge ], completionHandler: { (granted, error) in
                if ((error != nil)) { UIApplication.shared.registerForRemoteNotifications() }
                else {
                    
                }
            })
        }
        var body: some Scene {
            WindowGroup {
                ContentView()
            }
        }
    }
    
    

  2. In your case you are modifying App root View. So you can put your code into either init or onAppear. I’d suggest to use latter (onAppear) just to follow best practices. SwiftUI creates all the views immediately, even destination views for navigation links, which means that initializers are run immediately. While code placed in onAppear modifier is called only when the view is shown. So your code can look like this:

    import SwiftUI
    
    
    @main
    struct RSApp: App {
        var body: some Scene {
            WindowGroup {
                ContentView()
                .onAppear() {
                    let center = UNUserNotificationCenter.current()
                    center.requestAuthorization(options: [.alert, .sound, .badge]) { success, error in
                        if let error = error {
                            // Handle the error here.
                        }
                        // Enable or disable features based on the authorization.
                    }
                }
            }
        }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search