В своем приложении я применил код, который останавливает отправку уведомления каждый раз, когда пользователь переходит к определенному контроллеру представления, но теперь уведомление отправляется только один раз в самом начале после загрузки. Как я могу изменить его, чтобы отображать уведомление только один раз каждый раз после обновления приложения? Вот код:
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])
}
}
Когда вы сохраняете что-то в 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 user18413254 Это должно быть в вашем UIApplicationDelegate (первый файл, созданный Xcode). Вы заметите, что функция с таким именем и подписью уже существует — просто добавьте строку UserDefaults... в существующую функцию.
Эй, я сделал, как вы мне сказали, и это работает, большое спасибо за помощь
Эй, спасибо за ваш ответ, но не могли бы вы показать мне, где это должно быть в коде?