我创建了一个使用NSTimer的应用程序,它每秒都会被触发。
我的问题是如果Iphone处于睡眠模式,我会得到10到15的延迟 触发事件前几分钟。我有stackoverflowed和google这个 这个原因似乎是手机停止听某些 处于睡眠模式的事件。
有些人通过播放静音来解决这个问题,不允许这样做 电话睡觉。
代码:
timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(goAction)userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
-(void)goAction {
// Here i check for some dates and then call the activateBeepAlarmView
}
答案 0 :(得分:2)
因为没有人回答我的三个问题,我将不得不回答:
<强> 1。延迟的原因是什么? 我将引用Ben S:
在您的应用程序上调用applicationWillResignActive后,您只需停止接收事件: 当应用程序从活动状态转换为非活动状态时,委托可以实现此方法以进行调整。当应用程序处于非活动状态时,它正在执行但不会调度传入事件。当弹出覆盖窗口或设备被锁定时会发生这种情况。
睡眠模式是节省能源。为此,设备会停止侦听您要求的事件。 NSTimer事件仍将触发,因为它们不需要昂贵的(电池式)硬件监控。此外,使用NSTimer实现警报,因此即使在睡眠状态下它们也需要能够运行。否则,人们可能不会醒来并责怪他们的iPhone。
<强> 2。静音解决方案似乎是一个非常“肮脏”的解决方案。还有其他方法可以解决这个问题吗?
不,目前我还没有找到另一种解决方案,如果我错了,请随时纠正我。
查看this博客文章如何操作。
第3。如果我使用静音解决方案,它会通过苹果审查吗? 是
答案 1 :(得分:1)
当iPhone进入睡眠状态时,您的应用程序和运行NSTimer的runloop也会进入睡眠状态。
您似乎认为NSTimer是某种基于硬件的计时器。它不是。它完全在启动它的应用程序的软件内运行。我不知道是什么唤醒你的应用程序,但绝对不是NSTimer。
简而言之,你想做的事是不可能的。你无法在手机上睡觉,然后让应用程序仍处于活动状态并正在运行。静音技术只是保持手机清醒和应用程序运行的一个障碍。
如果您需要手机保持清醒,则需要将应用程序的idleTimerDisabled
设置为YES。这将阻止手机休眠,应用程序可以保持活动状态。但是一旦你让手机睡不着,它就无法从应用程序代码中唤醒。只有硬件才能响应警报或传入消息。
答案 2 :(得分:0)
每秒触发NSTimer时,您的应用会发生什么?请提供代码,显示计时器的创建以及计时器完成时调用的选择器的代码。
你是说“延迟10到15分钟”是什么意思?延迟总是那么长,或者你等待唤醒iPhone然后触发事件多长时间?
根据您每秒钟需要做的事情,您可以通过不同的方式处理这种情况。请回复,我们将尝试通过这个方式。
巴特
答案 3 :(得分:0)
@Jakob,
使用“官方SDK”是不可能的。如果您正在为监狱破坏的手机开发应用程序,那么您可以使用IOKit框架。有关详细信息,请参阅this。