即使在后台 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 中也连续调用方法的主要内容,如果未能解决你的问题,请参考以下文章