当iPhone处于睡眠模式时,iPhone应用程序延迟10-15分钟

问题描述:

我创建了一个使用NSTimer的应用程序,该应用程序每秒触发一次。当iPhone处于睡眠模式时,iPhone应用程序延迟10-15分钟

我的问题是,如果Iphone处于睡眠模式,我会在触发事件之前10分钟到15分钟之间延迟 分钟。我有*和谷歌搜索这 和原因这似乎是手机在睡眠模式下停止收听某些 事件。

有些人通过播放静音来解决此问题,但不允许 手机进入睡眠状态。

  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 
} 

好,因为没有人回答我的三个问题我会回答他们:

1.可能是延迟的原因是什么? 我将要引用Ben S

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

睡眠模式的要点是节约能源。为此,该设备停止监听您要求的事件。 NSTimer事件仍然会触发,因为它们不需要昂贵的(电池方式)硬件监视。此外,使用NSTimer实现警报,所以即使在睡眠时也需要能够运行。否则,人们可能不会醒来并责怪他们的iPhone。

2.静音解决方案似乎是一个非常“脏”的解决方案。有其他方法可以解决这个问题吗?
不,目前我还没有找到其他解决方案,请随时纠正我,如果我错了。 结账this博客文章如何做到这一点。

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

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

你是什么意思的“延迟10至15分钟”?延迟时间总是这么长,或者是你等待唤醒iPhone多久才会触发事件?

根据你每秒需要做什么,你可以用不同的方式处理这种情况。请回复,我们会尽力通过这个方式。

巴特

+0

延迟我的意思是说,activateBeepAlarmView被调用,手机开始发出嘟嘟声,而不按下电源按钮将其从睡眠/锁定模式中唤醒。如果我按下电源按钮,则应用程序会“唤醒”并播放嘟嘟声。 – jakob 2010-03-07 17:05:41

当iPhone进入睡眠状态,这样做你的应用程序,并在运行的NSTimer的runloop。

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

总之,你想要做什么是不可能的。您无法睡觉手机,然后让应用仍处于活动状态并正在运行。静音技术只是一个让手机保持清醒状态和应用程序运行的混乱状态。

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

+0

这是否意味着当用户使用锁定模式的电源按钮时,每个应用程序都必须使用某种黑客才能进入睡眠状态?例如Alaram Clock Pro? – jakob 2010-03-07 16:55:27

+0

据我所知。如果您关闭设备,我认为闹钟Pro不会工作。当然,他们不会做广告。 iPhone设计的基本规则是非Apple应用程序不能覆盖硬件。想想应用程序可能会遇到的所有问题,如果他们可以在没有人看到或更糟的情况下关闭设备时唤醒设备。你可能可以用低级别的BSD例程做些事情,但我很怀疑它。 – TechZen 2010-03-07 22:52:30

+0

嗨,谢谢你的回答,但我不认为我们真的相互了解。我不是在谈论关闭设备,而是用电源按钮锁定屏幕,这将导致iPhone进入睡眠模式(纠正我,如果我错了)。 – jakob 2010-03-08 09:42:09

@Jakob,

这是不可能的 “官方SDK”。如果你正在开发*破解手机的应用程序,那么你可以使用IOKit框架。欲了解更多信息,请参阅this