Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS Notification Trigger: fortnightly and/or quarterly

I can't seem to find any Apple Documentation for this exact scenario, and I've tried various ways to do this and I keep coming up empty.

I would like to schedule a repeating notification (iOS 10+ so UNCalendarNotificationTrigger or equivalent).
These are Local Notifications not Push Notifications.

My Goal:

Schedule notifications that repeat:

  • once a fortnight (e.g., every second Tuesday)
  • once a quarter (e.g., 1st of every 3 months)

My Current Approach:

These triggers work well, and are simple to implement (Running the code in a Swift Playground).

// Every day at 12pm
var daily = DateComponents()
daily.hour = 12
let dailyTrigger = UNCalendarNotificationTrigger(dateMatching: daily, repeats: true)
dailyTrigger.nextTriggerDate() // "Jan 4, 2017, 12:00 PM"

// Every Tuesday at 12pm
var weekly = DateComponents()
weekly.hour = 12
weekly.weekday = 3
let weeklyTrigger = UNCalendarNotificationTrigger(dateMatching: weekly, repeats: true)
weeklyTrigger.nextTriggerDate() // "Jan 10, 2017, 12:00 PM"

// The 1st of every month at 12pm
var monthly = DateComponents()
monthly.hour = 12
monthly.day = 1
let monthlyTrigger = UNCalendarNotificationTrigger(dateMatching: monthly, repeats: true)
monthlyTrigger.nextTriggerDate() // "Feb 1, 2017, 12:00 PM"

// Every 1st of February at 12pm
var yearly = DateComponents()
yearly.hour = 12
yearly.day = 1
yearly.month = 2
let yearlyTrigger = UNCalendarNotificationTrigger(dateMatching: yearly, repeats: true)
yearlyTrigger.nextTriggerDate() // "Feb 1, 2017, 12:00 PM"

But...

I can't seem to get a fortnightly or quarterly trigger to function correctly.

// Every second Tuesday at 12pm
// ... There is no "date.fortnight", is this possible?

// The 1st of every quarter at 12pm
var quarterly = DateComponents()
quarterly.hour = 12
quarterly.day = 4
// Values: 1, 2, 3 or 4 all produce the same "nextTriggerDate" - why?
quarterly.quarter = 4 
let quarterlyTrigger = UNCalendarNotificationTrigger(dateMatching: quarterly, repeats: true)
quarterlyTrigger.nextTriggerDate()

So, to be clear, my questions are:

  1. Is it possible to get a notification that repeats every fortnight?
  2. How do we get a trigger for once a quarter?

Since DateComponents() has a quarter unit, I assume that a quarterly trigger is possible. For the fortnightly reminder however, I'm not even sure if this is possible...

Any insight would be appreciated!

like image 841
Aᴄʜᴇʀᴏɴғᴀɪʟ Avatar asked Jan 03 '17 10:01

Aᴄʜᴇʀᴏɴғᴀɪʟ


1 Answers

I didn't see any direct option to trigger fortnight notification.Suggestion from my end.

1) Is it possible to get a notification that repeats every fortnight?

I am proposing two options:

  1. Can we use UNTimeIntervalNotificationTrigger to repeat the notification with a time interval of two weeks time? Example below

    let timeInterValFor2Weeks = 1190507.790425003
    
    let intervalTrigger = UNTimeIntervalNotificationTrigger(timeInterval: timeInterValFor2Weeks, repeats: true)//"Jan 3, 2017, 5:24 PM"
    
    intervalTrigger.nextTriggerDate() //"Jan 17, 2017, 12:05 PM"
    
  2. Schedule two UNCalendarNotificationTrigger trigger, which should trigger first and third day of a month. For example it should fire notification in first Sunday and third Sunday of a month.

    var fortnightPart1 = DateComponents()
    fortnightPart1.weekday = 1 //(Day..here Sunday)
    fortnightPart1.weekdayOrdinal = 2 //= n == (nth Day in the month...here 2nd Sunday in every month month)
    fortnightPart1.hour = 12
    
    let fortnightTrigger = UNCalendarNotificationTrigger(dateMatching: fortnightPart1, repeats: true)
    fortnightPart1.nextTriggerDate()
    

2) How do we get a trigger for once a quarter?

If there is no direct option available, then I suggest the same solution as above.

like image 186
user3608500 Avatar answered Nov 13 '22 04:11

user3608500