即使在后台 ios 中也连续调用方法

Posted

技术标签:

【中文标题】即使在后台 ios 中也连续调用方法【英文标题】:calling a method continuously even in background ios 【发布时间】:2014-10-13 06:46:52 【问题描述】:

有没有办法让应用程序在后台或者前台运行时一直调用一个方法。这个方法是用来检查时间并根据时间的变化触发通知的。

方法如下

-(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,而不考虑应用程序的状态

【问题讨论】:

设置NSTimer在目标时间触发;不要那样轮询挂钟。 NSTimer 无法在后台工作@Droppy。请参阅我在编辑中的方法 在app里写代码会进入后台... 这个方法必须连续调用,因为它是用来写设备日志的 除了“睡觉”和“醒来”之外,您还想在后台写入哪些设备日志?您想要做的事情会耗尽用户的电池并让您的应用被应用商店拒绝。 【参考方案1】:

正如 cmets 中所指出的,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 工作您可以在应用程序处于前台(或后台,如果您使用这些后台执行模式)时安排通知的方式,这将在特定时间点通知用户。

希望对你有帮助!

【讨论】:

我不想通知用户任何事情我只想在一天结束时发布通知,并且该通知将具有其选择器方法来执行某些操作。所以我不需要 UILocalNotification。 我的要求很简单。从方法发布 NSNotification 与应用程序状态无关。 正如我所说,您应该查看有关后台执行的文档,...但是如果您的要求是在特定时间点执行后台操作,我已经可以告诉您这不会工作。鉴于 Apple 为您提供的有限的后台执行可能性,您必须找到一种方法来实现您的目标。【参考方案2】:

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

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

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

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

【讨论】:

正如其他人指出的那样,NSTimer 是在给定时间执行代码的方法。您对它不在后台运行的担忧是无效的,因为对于包括您的轮询在内的所有其他代码都是如此。

以上是关于即使在后台 ios 中也连续调用方法的主要内容,如果未能解决你的问题,请参考以下文章

即使App被IOS中的用户杀死,如何每10秒调用一次api?

ios监听锁屏解锁如何实现,需要调用啥方法?

即使从主线程调用更新,UI 也不会更新

golang标准库--io

Xamarin iOS 后台应用程序终止

最佳后台处理/API 调用方法?