iOS Daily Local Push Notifications

眉间皱痕 提交于 2019-11-30 08:50:21

问题


I want to execute a UILocalNotification at 9:00 AM every day, forever, as long as the app is open. The closest thing I've found is this:

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = [[NSDate date] dateByAddingTimeInterval:60*60*24];
notification.alertBody = @"It's been 24 hours.";
[[UIApplication sharedApplication] scheduleLocalNotification:notification];

However, this code only executes a UILocalNotification once in 24 hours, not at a specified time. I've been looking into utilizing NSDate somehow, but have been getting no where.

The code will be executing in the AppDelegate in the application didFinishLaunchingWithOptions method. If someone were to open the application and place it in the background at 8:59 AM, the UILocalNotification would still execute at 9:00 AM.

An NSDateComponent won't work with this because I would have to declare a year, month, and day, but I want to execute this UILocalNotification every day without having to edit the code.


回答1:


You need to find the NEXT time that 9am occurs, and set the local notification to fire at that time:

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now];
[components setHour:9];
// Gives us today's date but at 9am
NSDate *next9am = [calendar dateFromComponents:components];
if ([next9am timeIntervalSinceNow] < 0) {
    // If today's 9am already occurred, add 24hours to get to tomorrow's
    next9am = [next9am dateByAddingTimeInterval:60*60*24];
}

UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.fireDate = next9am;
notification.alertBody = @"It's been 24 hours.";
// Set a repeat interval to daily
notification.repeatInterval = NSDayCalendarUnit;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];



回答2:


Your question has two problems:

  1. Obtain the right NSDate for the next fire date.
  2. Setup the local notification in order to fire every 24 hours

Here is a snippet:

// 1st: find next fire date, using NSDateComponents

NSDate * date = [NSDate date];
NSDateComponents * components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:date];

// Components will now contain information about current hour and minute, day, month and year.

// Do your calculation in order to setup the right date. Note that components reflect user timezone.
// For example, skip to the next day if current time is after 9:00:
if (components.hour >= 9) {
    components.day += 1;
}

// Now fix the components for firing time, for example 9:00.
components.hour = 9;
components.minute = 0;

NSDate * fireDate = [[NSCalendar currentCalendar] dateFromComponents:components];

NSLog(@"Notification will fire at: %@", fireDate);


// 2nd: Schedule local notification with repetitions:

UILocalNotification * notification = [[UILocalNotification alloc] init];
notification.fireDate = fireDate;
notification.repeatInterval = NSDayCalendarUnit; // Here is the trick

notification.alertBody = @"It's been 24 hours.";
[[UIApplication sharedApplication] scheduleLocalNotification:notification];



回答3:


Just set the repeatInterval before scheduling the notification

localNotification.repeatInterval = NSCalendarUnitDay;


来源:https://stackoverflow.com/questions/23748062/ios-daily-local-push-notifications

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!