xcode SwiftUI在没有按钮的情况下请求启动通知权限

ljsrvy3e  于 2022-12-19  发布在  Swift
关注(0)|答案(2)|浏览(222)

我希望在启动时向用户请求通知权限,而不强制用户单击特定按钮。Xcode 14.2
我的申请结构:

import SwiftUI
import UserNotifications

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

现在我应该在哪里添加这段代码来请求权限呢?

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
我知道我可以将其作为函数调用添加到按钮,但我希望用户无需单击任何内容即可请求访问,因此基本上是在视图初始化时。

mw3dktmi

mw3dktmi1#

这很简单:

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()
        }
    }
}
t2a7ltrp

t2a7ltrp2#

在您的情况下,您正在修改应用程序根视图。因此,您可以将您的代码放入initonAppear。我建议使用后者(onAppear)只是为了遵循最佳实践。SwiftUI立即创建所有视图,甚至导航链接的目标视图,这意味着初始化器会立即运行。而放在onAppear修饰符中的代码只有在视图显示时才被调用。所以你的代码看起来像这样:

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.
                }
            }
        }
    }
}

相关问题