我想在开始时请求用户的通知许可,而无需用户按下特定按钮。我如何在 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/