Я хотел бы запросить у пользователя разрешение на уведомление при запуске, не заставляя пользователя нажимать определенную кнопку. Xкод 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.
}
(из https://developer.apple.com/documentation/usernotifications/asking_permission_to_use_notifications)
Я знаю, что могу добавить его как вызов функции к кнопке, но я хотел бы запросить доступ без необходимости пользователю что-либо нажимать, поэтому в основном при инициализации представления.
Будет лучше, если вы не будете спрашивать разрешения на что-либо, пока пользователь не выполнит действие, для которого требуется разрешение.





Это легко:
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()
}
}
}
В вашем случае вы изменяете корневой вид приложения. Таким образом, вы можете поместить свой код либо в init, либо в onAppear. Я бы предложил использовать последний (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.
}
}
}
}
}
Посмотрите на
onAppear