kelsheikh
kelsheikh

Reputation: 1338

UNNotificationRequest to send local notification daily at a specific time

Since UILocalNotification was deprecated in iOS10, I'm having trouble understanding how to update the following code to the UNNotificationRequest framework. Im basically letting a user schedule a daily notification at a time of their choosing. For example, if they want to get a notification everyday at 11:00AM. The below code works for iOS versions below iOS10 but since UILocalNotification is deprecated, it no longer works. Any help is greatly appreciated.

    let notification = UILocalNotification()
    notification.fireDate = fixedNotificationDate(datePicker.date)
    notification.alertBody = "Your daily alert is ready for you!"
    notification.timeZone = TimeZone.current
    notification.repeatInterval = NSCalendar.Unit.day
    notification.applicationIconBadgeNumber = 1
    UIApplication.shared.scheduleLocalNotification(notification)

Upvotes: 3

Views: 1396

Answers (2)

Prasad Parab
Prasad Parab

Reputation: 409

You can use UNCalendarNotificationTrigger for creating a notification that fires repeatedly using UNUserNotificationCenter. You can do something like this. The trick is to only have the time component in the Trigger date.

        let center = UNUserNotificationCenter.current()

        let content = UNMutableNotificationContent()
        content.title = "Attention!"
        content.body = "Your daily alert is ready for you!"
        content.sound = UNNotificationSound.default

        let identifier = "com.yourdomain.notificationIdentifier"

        var triggerDate = DateComponents()
        triggerDate.hour = 18
        triggerDate.minute = 30
        let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: true)

        let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

        center.add(request, withCompletionHandler: { (error) in
            if let error = error {
                // Something went wrong
                print("Error : \(error.localizedDescription)")
            } else {
                // Something went right
                print("Success")
            }
        })

Upvotes: 6

andrija
andrija

Reputation: 342

You can't schedule a notification that repeats daily. That notification would happen only once, and then you would have to schedule it again, which means that you would have to open the app again.

There is BGTask API introduces in iOS 13, that can be used to perform some background tasks, but not this one, you can not schedule the task for specific time.This API last only works when app is in the background, not when it is killed. You can only set some time interval that the system will use as a guiding point to determine when to perform you app's code. But in my experience it is pretty unreliable.

The only way to achieve this is to implement remote push notifications. Push notifications also work even when the app is killed.

Upvotes: 0

Related Questions