Планирование локальных уведомлений в swift

В своем приложении я применил код, который останавливает отправку уведомления каждый раз, когда пользователь переходит к определенному контроллеру представления, но теперь уведомление отправляется только один раз в самом начале после загрузки. Как я могу изменить его, чтобы отображать уведомление только один раз каждый раз после обновления приложения? Вот код:

import UIKit
import UserNotifications
class firstViewController: UIViewController, UNUserNotificationCenterDelegate {
override func viewDidLoad() {
    super.viewDidLoad()

            // Do any additional setup after loading the view.
    
    
            let center = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.badge,.sound,.alert]) { granted, error in
                if error == nil {
                    print("User permission is granted : \(granted)")
                }
          }
    let defaults = UserDefaults.standard

       // Check for flag, will be false if it has not been set before
       let userHasBeenNotified = defaults.bool(forKey: "userHasBeenNotified")

       // Check if the flag is already true, if it's not then proceed
       guard userHasBeenNotified == false else {
           // Flag was true, return from function
           return
       }
    
    
    //        Step-2 Create the notification content
                let content = UNMutableNotificationContent()
                content.title = "Hello"
                content.body = "Welcome"
           
            
        //        Step-3 Create the notification trigger
                let date = Date().addingTimeInterval(2)
                let dateComponent = Calendar.current.dateComponents([.year,.month,.day,.hour,.minute,.second], from: date)
                let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponent, repeats: false)
            
            
            
        //       Step-4 Create a request
                let uuid = UUID().uuidString
                let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger)
                
            
        //      Step-5 Register with Notification Center
                center.add(request) { error in
            
                    defaults.setValue(true, forKey: "userHasBeenNotified")
                }
        }

        func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    willPresent notification: UNNotification,
                                    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            completionHandler([.sound,.banner,.badge])
          
        
        }
    }
    

    
    
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы сохраняете что-то в UserDefaults, оно остается даже после закрытия приложения. Вот почему уведомление больше не отображается.

Если вы не хотите, чтобы он сохранялся при запуске приложения, вы должны установить для него значение false во время запуска приложения (я полагаю, это то, что вы подразумеваете под обновлением):

Вы можете добавить это в свой UIApplicationDelegate (или добавить строку в существующий didFinishLaunchingWithOptions):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        // this clears the flag
        UserDefaults.standard.setValue(false, forKey: "userHasBeenNotified")
        return true
    }

Или, если у вас есть способ совместного использования состояния во всем приложении (возможно, одиночный), вы можете избежать UserDefaults и сохранить его как член любого класса, который вы используете.

Эй, спасибо за ваш ответ, но не могли бы вы показать мне, где это должно быть в коде?

user18413254 23.03.2022 20:34

@user18413254 user18413254 Это должно быть в вашем UIApplicationDelegate (первый файл, созданный Xcode). Вы заметите, что функция с таким именем и подписью уже существует — просто добавьте строку UserDefaults... в существующую функцию.

atultw 23.03.2022 21:00

Эй, я сделал, как вы мне сказали, и это работает, большое спасибо за помощь

user18413254 23.03.2022 21:24

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