Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Repeating local notification daily at a set time with swift

I am new to iOS development, but have created the app and I am trying to create a daily notification for a set time. Currently the notification executes once for the given date/time. I am unsure how to use the repeatInterval method to schedule it daily. What is the best method to repeat the notification daily ? any help would be much appreciated (Y).

    var dateComp:NSDateComponents = NSDateComponents()
    dateComp.year = 2015;
    dateComp.month = 06;
    dateComp.day = 03;
    dateComp.hour = 12;
    dateComp.minute = 55;
    dateComp.timeZone = NSTimeZone.systemTimeZone()

    var calender:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    var date:NSDate = calender.dateFromComponents(dateComp)!

    var notification:UILocalNotification = UILocalNotification()
    notification.category = "Daily Quote"
    notification.alertBody = quoteBook.randomQuote()
    notification.fireDate = date
    notification.repeatInterval = 

    UIApplication.sharedApplication().scheduleLocalNotification(notification)
like image 949
JUSDEV Avatar asked Jun 03 '15 12:06

JUSDEV


4 Answers

You have to provide an NSCalendarUnit value like “HourCalendarUnit” or “DayCalendarUnit” for repeating a notification.

Just add this code to repeat the local notification daily :

notification.repeatInterval = NSCalendarUnit.CalendarUnitDay
like image 163
Vizllx Avatar answered Sep 22 '22 06:09

Vizllx


So, had to modify the @vizllx's above code slighty. Here is the new line:

notification.repeatInterval = NSCalendarUnit.Day 

Here is a full working example I used:

let notification = UILocalNotification()

  /* Time and timezone settings */
  notification.fireDate = NSDate(timeIntervalSinceNow: 8.0)
  notification.repeatInterval = NSCalendarUnit.Day
  notification.timeZone = NSCalendar.currentCalendar().timeZone
  notification.alertBody = "A new item is downloaded."

  /* Action settings */
  notification.hasAction = true
  notification.alertAction = "View"

  /* Badge settings */
  notification.applicationIconBadgeNumber =
  UIApplication.sharedApplication().applicationIconBadgeNumber + 1
  /* Additional information, user info */
  notification.userInfo = [
    "Key 1" : "Value 1",
    "Key 2" : "Value 2"
  ]

  /* Schedule the notification */
  UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
like image 21
Keith Holliday Avatar answered Sep 23 '22 06:09

Keith Holliday


The other answers show how to use the old, pre iOS 10 local notifications. With iOS 10 and later, you must use UNNotificationCenter as follows:

    let content = UNMutableNotificationContent()
    content.title = "This will appear in bold, on it's own line."
    content.subtitle = "This will appear in bold, on it's own line, below the title."
    content.body = "This will appear as normal text, below the title and subtitle."

    let triggerInputForHourlyRepeat = Calendar.current.dateComponents([.minute], from: intendedFireDateVariable)
    let trigger = UNCalendarNotificationTrigger.init(dateMatching: triggerInput, repeats: true)

    let request = UNNotificationRequest(identifier: "someUniqueID", content: content, trigger: trigger)
    let unc = UNUserNotificationCenter.current()
    unc.add(request, withCompletionHandler: { (error) in
        /// Handle error
    })

Helpful tutorials:

  1. https://www.techotopia.com/index.php/An_iOS_10_Local_Notification_Tutorial
  2. https://makeapppie.com/2016/11/21/manage-delete-and-update-notifications-in-ios-10/
like image 22
Dave G Avatar answered Sep 20 '22 06:09

Dave G


var repeatInterval: NSCalendarUnit

=> the docs say "The calendar interval at which to reschedule the notification."

so: use NSCalendarUnit.CalendarUnitDay

like image 32
Daij-Djan Avatar answered Sep 24 '22 06:09

Daij-Djan