ios - SwiftUI 在没有按钮的情况下询问通知权限

标签 ios swift xcode swiftui

我想在开始时请求用户的通知许可,而无需用户按下特定按钮。我如何在 Xcode 12.5 中执行此操作?

这是我的应用程序结构:

import SwiftUI
import UserNotifications

@main
struct KiwiApp: App {
    let persistenceController = PersistenceController.shared
    let center = UNUserNotificationCenter.current()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

现在我应该在什么地方添加这段代码来请求权限?

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

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

我知道我可以将它添加为对按钮的函数调用,但我想请求访问而无需用户按任何按钮,所以基本上是在初始化 View 时。或者我是否需要在 ContenView.swift 的某处执行此操作?

编辑:

简答:将请求代码放在 App Struct 的 init() 函数中。

struct KiwiApp: App {
    let persistenceController = PersistenceController.shared
    let center = UNUserNotificationCenter.current()
    
    init() {
        center.requestAuthorization(options: [.sound , .alert , .badge ], completionHandler: { (granted, error) in
            if let error = error {
                // Handle the error here.
            }
            // Enable or disable features based on the authorization.
        })
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}```

最佳答案

使用UIApplicationDelegateAdaptor

@main
struct KiwiApp: App {
    let persistenceController = PersistenceController.shared
    let center = UNUserNotificationCenter.current()
    
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        
        registerForNotification()
        return true
    }
    
    
    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 {
                
            }
        })
    }
}

或者使用init

@main
struct KiwiApp: App {
    let persistenceController = PersistenceController.shared
    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()
                .environment(\.managedObjectContext, persistenceController.container.viewContext)
        }
    }
}

关于ios - SwiftUI 在没有按钮的情况下询问通知权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68191982/

相关文章:

ios - 应用程序因缺少 IPv6 而被拒绝,这是服务器还是应用程序问题?

ios - 水平ScrollView停在中间

ios - 是否可以在 ubuntu 中为 ios 开发设置 cordova?

ios - 为什么在 UITableView 中自定义单元格会收到错误 : hasn't received initWithFrame: or initWithCoder?

ios - 符合协议(protocol)的类 - 编译时检查

ios - Firebase 推送通知仅显示在控制台中,不会在后台加载

ios - UILabel sizeToFit 不会拉伸(stretch)到宽度

ios - Swift:在转义被调用函数的闭包中捕获inout参数

ios - 如何根据用户选择在 CollectionView 标题下方显示不同的单元格?

ios - ipatool 因异常而失败