-1

我有一个小时hoursArray数组和分钟数组,现在我从系统minutesArray中获取了current date包含当前月份元素的数组,这意味着如果 4 月有 30 天,那么 hoursArray/ 中将有 30 小时/分钟minutesArray 我已插入数组中,并且我将当前日期作为数组的索引。

我所做的是通知在当天触发,但直到我每天使用应用程序才会在第二天触发,因为当我每天使用应用程序之前,当我转向后台模式和通知响铃时会调用触发时间方法。

现在我希望在日期更改时自动触发通知,即使我有几天不使用该应用程序,这些东西都应该didEnterBackground...appDelegate

我遵循了这个答案,但它每天用于同一时间但我希望每天与基于当前日期的数组索引的数组不同的时间(这意味着当天,例如今天是 4 月 19 日,小时和分钟数组的索引应该是 19 )。

这是我的数组的样子

小时数组 = [9, 10, 11, 13, 14, 11, 17, 2, 15, 5.... 等等]

分钟数组 = [23, 00, 04, 58, 59, 12, 01, 33,.... 等等]

方法调用appdelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application
{     
 [self.viewController triggerAutomaticallyDaily];
 [self applicationSignificantTimeChange:application];
 [self refreshAlarm];
}

里面的方法viewcontroller.m

-(void)triggerAutomaticallyDaily {
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar] ;
NSDate *now = [NSDate date];

NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute) fromDate:now]; 
[components setHour:hoursArray[currentDay]]; //currentDay the todays date is 16 I am getting current date from system.
[components setMinute:minutesArray[currentDay]];

UILocalNotification *notification = [[UILocalNotification alloc]init];
notification.fireDate = [calendar dateFromComponents:components];
notification.repeatInterval = NSDayCalendarUnit;
[notification setAlertBody:@"This is your task time"];
// notification.soundName = UILocalNotificationDefaultSoundName;
[[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
}

每个午夜后时间会发生显着变化,方法在Appdelegate

-(void)applicationSignificantTimeChange:(UIApplication *)application {
[self.viewController triggerAutomaticallyDaily];
}

刷新报警方法Appdelegate

- (void)refreshLabel
{
//refresh the alarm on the main thread
dispatch_async(dispatch_get_main_queue(),^{      
[self.viewController triggerAutomaticallyDaily];
});
// check every 10000s
[self performSelector:@selector(refreshLabel) withObject:nil afterDelay:10000]; 
}

看看didEnterBackground...当我退出我的应用程序时,通知方法只会被调用一次。不是吗??以及当我一周不打开应用程序但我想收到通知时,我如何收到每日通知,如何调用方法?每次在后台模式下都会调用方法吗?

有什么办法可以安排通知,当第一个通知完成时,第二个应该被触发,如果第二个完成,那么第三个应该被触发,等等在后台模式下,即使我一周不打开应用程序? ? 应根据数组中给出的当前日期和时间触发通知。

更新 我什至放置了刷新功能,它在每 10000 秒后刷新一次触发器,但它不起作用。

我还补充说significantTimechanges,如果有午夜变化,但它在这里不起作用是我如何定义的。

4

3 回答 3

0

重要提示:如果应用程序长时间处于终止状态或后台,开发人员无法执行任何操作。所以这是做不到的。

您的要求有很多问题:

1.1:days data您在一项服务中有多少个for a monthfor a year或 ?

1.2:为什么不push呢?

1.3:为什么你想local notification每天安排,而你可以一次安排很多?

1.4:没有办法app在它未打开(被用户杀死)时进行更改,所以在这种情况下你不能做任何事情。

现在来看看我们能做什么:

2.1:考虑到您正在获取每月数据。所以你应该通过增加和设置相应的时间来安排所有local notifications的时间。如果用户每个月打开一次应用程序(90% 的机会他会打开),那么你就可以向服务器请求下个月的数据并做同样的事情。for loopday component(from your arrays by day index)

2.2:为什么不在服务器端处理这个问题并push notifications使用local. 服务器人员可以为每分钟配置一个 cron 作业,该作业将为用户获取所有小时和分钟,并将发送push.

我的建议不要使用,local但您可以使用所有最大值2.1(一次安排所有月通知)。

于 2018-04-19T07:19:36.247 回答
0

正如其他人所说,更好的技术是一次安排所有通知。这就是我所做的。但是,系统限制为 64 个待处理的本地通知。在您的情况下,计划的通知应在 64 天内每天触发。我有一个更困难的问题,因为我需要每 15 分钟安排一次通知。因此,如果我的用户在 16 小时内没有回复,他们将不会收到进一步的通知 (64/4 = 16)。另外,请注意 UILocalNotification 已被弃用,因此您应该使用 UNNotificationRequest。请注意,UNCalendarNotificationTrigger 中的标识符对于每个请求必须是唯一的。

    content.categoryIdentifier = @"com.nelsoncapes.localNotification";
    NSDate *today = [NSDate date];
    NSDate *fireDate = [today dateByAddingTimeInterval:interval];
    // first extract the various components of the date
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSInteger year = [calendar component:NSCalendarUnitYear fromDate:fireDate];
    NSInteger month = [calendar component:NSCalendarUnitMonth fromDate:fireDate];
    NSInteger day = [calendar component:NSCalendarUnitDay fromDate:fireDate];
    NSInteger hour = [calendar component:NSCalendarUnitHour fromDate:fireDate];
    NSInteger minute = [calendar component:NSCalendarUnitMinute fromDate:fireDate];
    NSDateComponents *components = [[NSDateComponents alloc]init];
    components.year = year;
    components.month = month;
    components.day = day;
    components.hour = hour;
    components.minute = minute;
…
// construct a calendarnotification trigger and add it to the system
    UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: identifier content:content trigger:trigger];
    [center addNotificationRequest:request withCompletionHandler:^(NSError *error){
        if(error){
        NSLog(@"error on trigger notification %@", error);
        }
    }];
于 2018-07-01T18:12:35.520 回答
0

只需使用以下语句而不是NSCalendar

UILocalNotification *notification = [[UILocalNotification alloc]init];
notification.fireDate = [[NSDate date] dateByAddingTimeInterval:(hours*3600)+(Mins*60)];

//时间间隔单位应该是秒

notification.repeatInterval = NSDayCalendarUnit;
[notification setAlertBody:@"This is your task time"];
[[UIApplication sharedApplication] scheduleLocalNotification:notification]; 
于 2018-04-16T12:52:44.170 回答