Mohsinali Matiya
Mohsinali Matiya

Reputation: 66

How to set Local Notification repeat interval on Prayer time different times?

In local notifications there is repeatInterval property where we can put the unit repeat intervals for minute, hour, day, week, year, etc.

I want that repeat interval on Prayer time hours and every day same process.

So every Prayer time hours the local notification comes.

Prayer time is everyday different times

Upvotes: 1

Views: 1299

Answers (4)

Atif Imran
Atif Imran

Reputation: 2049

Yes you can push a notification at a particular time and day with a repeat option.

Follow the code below:

//1. catch the notif center
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];



//2. I prefer removing any and all previously pending notif
[center removeAllPendingNotificationRequests];

//then check whether user has granted notif permission
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
                // Notifications not allowed, ask permission again
                [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert)
                                      completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                          if (!error) {
                                              //request authorization succeeded!
                                          }
                                      }];
            }
        }];


//3. prepare notif content
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = [NSString localizedUserNotificationStringForKey:NSLocalizedString(@"Hello! Today's Sunday!!",nil) arguments:nil];
content.body = [NSString localizedUserNotificationStringForKey:NSLocalizedString(@"Sleep tight!",nil) arguments:nil];
content.sound = [UNNotificationSound defaultSound];
content.badge = @([[UIApplication sharedApplication] applicationIconBadgeNumber] + 1);

//4. next, create a weekly trigger for notif on every Sunday
NSDate* sundayDate = startDate;
NSDateComponents *components = [[NSDateComponents alloc] init];
while(true){
        NSInteger weekday = [[NSCalendar currentCalendar] component:NSCalendarUnitWeekday fromDate:sundayDate];
            if(weekday == 1){//sunday, stay asleep reminder . LOL
                components.weekday = 1;
                components.hour = 9;
                components.minute = 0;
                break;
            }else{//keep adding a day
                [components setDay:1];
                sundayDate = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:sundayDate options:0];
            }
        }

//5. Create time for notif on Sunday
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [calendar components:unitFlags fromDate:sundayDate];
comps.hour   = 9;
comps.minute = 0;
sundayDate = [calendar dateFromComponents:comps];

NSDateComponents *triggerWeekly = [[NSCalendar currentCalendar] components:NSCalendarUnitWeekday + NSCalendarUnitHour + NSCalendarUnitMinute fromDate:sundayDate];
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerWeekly repeats:YES];

//6. finally, add it to the request
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"LocalIdentifier"                                                                            content:content trigger:trigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"Local Notification succeeded");
        } else {
            NSLog(@"Local Notification failed");
        }
    }];

If you are looking for actionable items on the notification. You should add it somewhere in the center.

UNNotificationAction *snoozeAct = [UNNotificationAction actionWithIdentifier:@"Snooze"
                                                                           title:NSLocalizedString(@"Snooze",nil) options:UNNotificationActionOptionNone];
UNNotificationAction *deleteAct = [UNNotificationAction actionWithIdentifier:@"Delete"
                                                                           title:NSLocalizedString(@"Delete",nil) options:UNNotificationActionOptionDestructive];
UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:identifier
                                                                              actions:@[snoozeAct,deleteAct] intentIdentifiers:@[]
                                                                              options:UNNotificationCategoryOptionNone];
NSSet *categories = [NSSet setWithObject:category];
[center setNotificationCategories:categories];
content.categoryIdentifier = @"ActionIdentifier";

Make sure you set a different identifier for your notification request!

Upvotes: 0

Midhun K Mohan
Midhun K Mohan

Reputation: 201

i have done a app like this try this .

func scheduleNotification() {

    let dateString = "2017-04-04 09:00:00"
    let dateFormatter = DateFormatter()

    var localTimeZoneName: String { return TimeZone.current.identifier }
    var secondsFromGMT: Int { return TimeZone.current.secondsFromGMT() }
    dateFormatter.timeZone = TimeZone(secondsFromGMT: secondsFromGMT)
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"

    let dateObj:Date = dateFormatter.date(from: dateString)!



    let triggerDaily = Calendar.current.dateComponents([.hour,.minute,.second,], from: dateObj)


    let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)


    let content = UNMutableNotificationContent()
    content.title = "mIdeas"
    content.body = getRandomMessage()
    content.sound = UNNotificationSound.default()
    content.categoryIdentifier = "myCategory"


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

    UNUserNotificationCenter.current().delegate = self
    //this commented code is to remove the pre-seted  notifications so if you need multiple times don't use this line of code
   //UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
    UNUserNotificationCenter.current().add(request) {(error) in

        if let error = error {
            print("Uh oh! i had an error: \(error)")
        }
    }
}

call this function to set notification you can modify this func and add parameters to pass time

Upvotes: 0

Anand Kore
Anand Kore

Reputation: 1330

You can set repeat interval as day and pass array of local notifications of different time.

myapp.scheduledLocalNotifications = arrayOfNOtifications;

this may help you : how to create multiple local notifications

Upvotes: 0

Jon Rose
Jon Rose

Reputation: 8563

You can't do it with repeat. Make a bunch of different make notifications - one for each day - for the next 30 days. When the user opens the app, then recreate them for the next 30.

Upvotes: 0

Related Questions