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

Posted

技术标签:

【中文标题】iphone 处于睡眠模式时,iphone 应用程序延迟 10 -15 分钟【英文标题】:Iphone app is delayed for 10 -15 minutes when iphone is in sleep mode 【发布时间】:2011-01-24 16:53:36 【问题描述】:

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

我的问题是,如果 Iphone 处于睡眠模式,我会延迟 10 到 15 事件触发前的几分钟。我已经***ed并用谷歌搜索了这个 其原因似乎是电话停止收听某些 处于睡眠模式时的事件。

有些人通过播放静音解决了这个问题,不允许 打电话睡觉。

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

代码:

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】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

这是否意味着当用户使用电源按钮进入锁定模式时,每个运行的应用程序都必须使用某种黑客手段才能使其不进入睡眠状态?例如报警时钟专业版? 据我所知。如果您关闭设备,我认为 Alarm Clock Pro 也不起作用。当然,他们不会宣传它确实如此。 iPhone 设计的一个基本规则是非 Apple 应用程序不能覆盖硬件。想想如果应用程序可以在没有人在看或更糟糕的情况下将设备唤醒时,它们可能会遇到的所有麻烦。您也许可以使用低级别的 BSD 例程做一些事情,但我对此表示严重怀疑。 您好,再次感谢您的回答,但我认为我们并不真正了解对方。我不是在谈论关闭设备,而是用电源按钮锁定屏幕,这将导致 iphone 进入睡眠模式(如果我错了,请纠正我)。 据我所知,按下电源按钮会关闭所有应用程序和几乎所有操作系统。电话、闹钟等的唤醒是由硬件完成的,我认为 API 不允许访问这些功能。一旦用户使用硬件开关将其关闭,我还没有看到任何表明应用程序可以唤醒设备的信息。即使我对这一切都错了,我可以明确地告诉你 NSTimer 在设备处于睡眠状态时不会运行。 NSTimer 是纯软件,与硬件无关。你会寻找更低级别的东西。查看 IORegister。 感谢您的提示!但是我对您对电源按钮的描述仍然有些困惑。听起来你在谈论主页按钮?但是,为什么应用程序会在 10 到 15 分钟后“唤醒”,是不是 iphone 在进入“深度睡眠模式”时(不知道它叫什么),手机仍然会检查是否发生了某些事情,但在间隔 10 - 15 分钟。【参考方案3】:

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

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

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

巴特

【讨论】:

延迟是指调用了 activateBeepAlarmView 并且手机开始发出哔哔声,而我没有按下电源按钮将其从睡眠/锁定模式中唤醒。如果我按下电源按钮,那么应用会“唤醒”并播放哔声。【参考方案4】:

@雅各布,

使用“官方 SDK”是不可能的。如果您正在为越狱的手机开发应用程序,那么您可以使用 IOKit 框架。更多信息请参考this。

【讨论】:

以上是关于iphone 处于睡眠模式时,iphone 应用程序延迟 10 -15 分钟的主要内容,如果未能解决你的问题,请参考以下文章

当 Apple Watch 处于后台状态或睡眠模式时,我们如何从 iphone 向 Apple Watch 发送消息?

应用程序处于睡眠模式时如何检测语音?

iPhone上睡眠模式下的UILocalNotification

我们如何检查iphone是不是处于待机模式?

当应用程序处于后台模式时,是不是可以在 iPhone 中闪烁手电筒?

当我的应用程序处于后台模式时,检测从 iPhone 插入或拔出耳机插孔