甚至在后台ios中连续调用方法

时间:2014-10-13 06:46:53

标签: ios objective-c uilocalnotification uibackgroundtask

只要应用程序在后台或前台运行,是否有办法连续调用方法。此方法用于检查时间并根据时间的变化触发通知。

这是方法

-(void)checkDate
{ 
   NSDate *today = [NSDate date];
   NSString *endTime =@"24:00";
   NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
   [dateFormatter setDateFormat:@"HH:mm"];
   NSString *currentTime = [dateFormatter stringFromDate:today];
   NSLog(@"############ Current time is  %@",currentTime);
   if ([currentTime isEqualToString: endTime]) {
      NSLog(@"notifiction Fired");
      [[NSNotificationCenter defaultCenter]postNotificationName:@"todayEnds" object:self];
   }
}

我的要求是从方法发布NSNotification,而不管应用状态

2 个答案:

答案 0 :(得分:2)

正如评论中所指出的,NSTimer仅在您的应用目前位于前台时才有效。在iOS中,后台应用程序的代码执行非常棘手。

实现这一目标有几种可能性,我怀疑这些可能适合您的目的,例如:

  • 核心位置更新:如果您在应用中使用Core Location,您的应用可以在设备的GPS位置发生变化时获得更新,并有机会执行某些操作基于新GPS数据的背景
  • IP语音该应用提供基于IP的语音服务。具有此密钥的应用程序会在系统启动后自动启动,以便应用程序可以重新建立VoIP服务。使用此密钥的应用也可以播放背景音频。(来自Apple Docs)
  • 后台抓取:使用后台抓取,您可以定期执行网络请求,但是您仍然无法在可以精确指定的时间点执行操作,您可以更确切地说您想要定期执行网络请求的iOS,iOS会为您安排请求。 Here is an excellent read on background fetches

有关详细信息,请查看Apple Docs on background execution

对于您的情况,我建议您查看UILocalNotification。它并非100%清楚我到底想要达到的目的,但UILocalNotification可能是你的方式,因为它听起来像你想根据不同的时间通知用户。 。UILocalNotification的工作方式是,当应用程序位于前台时(如果您使用这些后台执行模式,则可以安排通知),这将在特定时间点通知用户。

希望它有所帮助!

答案 1 :(得分:0)

  

我的要求很简单。无论应用程序状态如何,都从方法中提取NSNotification。

这在iOS中是不可能的。正如nburk所描述的那样,应用程序无法在后台运行的一般规则几乎没有例外。您必须使用其中一个例外或找到一种不同的方式来实现您想要的目标。

顺便说一句:您检测某个时间点的代码看起来很可疑。也许您应该描述您的目标是什么,以便我们可以帮助您找到可行的解决方案。

Here's an answer描述了如何检测日期变化(在午夜发出通知)。它包括一个有效的Xcode项目。