0

我创建了一个使用 NSTimer 的应用程序,它每秒触发一次。

我的问题是,如果 Iphone 处于睡眠模式,我会在事件触发前延迟 10 到 15 分钟。我已经stackoverflowed和google了这个,原因似乎是手机在睡眠模式下停止监听某些事件。

有些人通过播放静音而不让手机休眠来解决这个问题。

  1. 延迟的原因可能是什么?
  2. 静音解决方案似乎是一个非常“肮脏”的解决方案。有没有其他方法可以解决这个问题?
  3. 如果我使用静音解决方案,它会通过苹果审查吗?

代码:

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 
}
4

4 回答 4

2

好吧,既然没有人回答我的三个问题,我将不得不回答他们:

1. 延迟的原因可能是什么? 我将不得不引用Ben S的话:

一旦 applicationWillResignActive 在您的应用程序上被调用,您只需停止接收事件:委托可以实现此方法以在应用程序从活动状态转换到非活动状态时进行调整。当应用程序处于非活动状态时,它正在执行但不分派传入事件。当弹出覆盖窗口或设备被锁定时会发生这种情况。

睡眠模式的重点是节省能源。为此,设备会停止侦听您要求的事件。NSTimer 事件仍然会触发,因为它们不需要昂贵的(电池方面的)硬件监控。此外,警报是使用 NSTimer 实现的,因此即使在睡眠中也需要能够正常工作。否则,人们可能不会醒来并责怪他们的 iPhone。

2.静音解决方案似乎是一个很“肮脏”的解决方案。有没有其他方法可以解决这个问题?
不,目前我还没有找到其他解决方案,如果我错了,请随时纠正我。查看博客文章如何操作。

3. 如果我使用静音解决方案,它会通过苹果审查吗? 是的

于 2010-03-30T07:25:21.453 回答
1

当 iPhone 进入睡眠状态时,您的应用程序和运行 NSTimer 的 runloop 也会进入睡眠状态。

您似乎认为 NSTimer 是某种基于硬件的计时器。它不是。它完全在启动它的应用程序的软件中运行。我不知道是什么唤醒了您的应用程序,但它绝对不是 NSTimer。

简而言之,你想做的事情是不可能的。你不能让手机休眠,然后让应用程序仍然处于活动状态并运行。静音技术只是让手机保持清醒和应用程序运行的一个小工具。

如果您需要手机保持唤醒状态,则需要将应用程序设置idleTimerDisabled为“是”。这将防止手机进入睡眠状态,并且应用程序可以保持活动状态。但是一旦你让手机休眠,它就无法从应用程序代码中唤醒。只有硬件可以响应警报或传入消息来执行此操作。

于 2010-03-07T16:32:25.753 回答
0

当每秒触发 NSTimer 时,您的应用程序会发生什么?请提供显示计时器创建的代码以及计时器完成时调用的选择器的代码。

另外,“延迟 10 到 15 分钟”是什么意思?延迟总是那么长还是等待唤醒iPhone然后触发事件的时间?

根据您每秒需要做什么,您可以用不同的方式处理这种情况。请回复,我们会努力解决这个问题。

巴特

于 2010-03-07T16:24:37.910 回答
0

@雅各布,

这对于“官方 SDK”是不可能的。如果您正在为越狱手机开发应用程序,那么您可以使用 IOKit 框架来实现这一点。有关更多信息,请参阅

于 2010-10-06T19:44:07.213 回答