SwiftUI запрашивает разрешение на уведомление при запуске без кнопки

Я хотел бы запросить у пользователя разрешение на уведомление при запуске, не заставляя пользователя нажимать определенную кнопку. 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)

Я знаю, что могу добавить его как вызов функции к кнопке, но я хотел бы запросить доступ без необходимости пользователю что-либо нажимать, поэтому в основном при инициализации представления.

Посмотрите на onAppear

jnpdx 18.12.2022 22:16

Будет лучше, если вы не будете спрашивать разрешения на что-либо, пока пользователь не выполнит действие, для которого требуется разрешение.

HangarRash 18.12.2022 22:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это легко:

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

Другие вопросы по теме