每天在特定时间调用方法

Posted

技术标签:

【中文标题】每天在特定时间调用方法【英文标题】:Calling A Method At Specific Time Every Day 【发布时间】:2013-05-15 06:36:02 【问题描述】:

我的应用程序一直在自助服务终端模式下运行。在特定时间每 24 小时一次,我需要将一些数据从核心数据同步到 Web 服务。

我知道如何进行同步,但我不知道如何安排应用程序在每天的特定时间进行同步调用,例如凌晨 02:45。

当应用不断运行时,是否可以这样做?

【问题讨论】:

当然有可能。 :) 我不能具体说明如何,但它必须类似于警报逻辑,在特定时间触发一些动作。 @motionpotion 看看这个链接可能你想要这个redth.codes/ios7-recipe-background-fetching @motionpotion : 如果你得到了解决方案,请与我分享...我在过去很多天都在尝试相同的任务...帮助我 【参考方案1】:

使用本地通知。这里有教程:http://www.icodeblog.com/2010/07/29/iphone-programming-tutorial-local-notifications/

希望这可以帮助你开始......

这也是:

Local Notifications

Background Tasks

【讨论】:

有没有办法在不使用本地通知的情况下做到这一点? 如果用户没有授予权限怎么办?【参考方案2】:

感谢@lakesh 的提示,我想通了。在对某人有所帮助的情况下发布解决方案,因为我发现 NSNotification 示例一开始很难理解。

在我的主视图控制器中,我添加了以下方法:

- (void)scheduleNotification

[[UIApplication sharedApplication] cancelAllLocalNotifications];

UILocalNotification *notif = [[UILocalNotification alloc] init];

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];

components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]];

NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];

[components setDay: day];
[components setMonth: month];
[components setYear: year];
[components setHour: 02];
[components setMinute: 45];
[components setSecond: 0];
[calendar setTimeZone: [NSTimeZone systemTimeZone]];
NSDate *dateToFire = [calendar dateFromComponents:components];

notif.fireDate = dateToFire;
notif.timeZone = [NSTimeZone systemTimeZone];
notif.repeatInterval = NSDayCalendarUnit;

[[UIApplication sharedApplication] scheduleLocalNotification:notif];

这为今天凌晨 02:45 的通知设置了触发日期,并且每天重复。

在视图控制器的 viewDidLoad 中,我调用了上述方法:

[self scheduleNotification];

在 appdelegate 中,我执行以下操作:

- (void)application:(UIApplication *)application didReceiveLocalNotification:    (UILocalNotification *)notification
   
application.applicationIconBadgeNumber = 0;
    //call your method that you want to do something in your app
 

【讨论】:

如果这样做,用户会看到一条空白消息吗?【参考方案3】:

一个简单的解决方案就是将NSTimer 设置为每分钟(例如每秒)检查当前日期。如果当前日期大于所需日期,则触发该方法并更新所需日期。

【讨论】:

以上是关于每天在特定时间调用方法的主要内容,如果未能解决你的问题,请参考以下文章

在特定时间调用方法或操作

让bot在特定时间每天发送消息

每天上午 10 点调用一种方法

swift 4 定时器在特定时间开始,然后做间隔

在固定时间间隔后调用特定方法

AlarmManager 不调用 BroadcastReceiver