自iPhone 3.0以来,idleTimerDisabled无法正常工作。

15

我已经使用过:

[UIApplication sharedApplication].idleTimerDisabled = YES;

我曾经开发并运行在iPhone OS 2.x系统下的一些应用程序,从来没有遇到过任何问题。这些应用是时钟应用,因此需要持续运行并忽略iPhone的闲置计时器设置。

然而,尝试在运行OS 3.0的新应用程序中实现相同的功能(由于使用了一些3.0 API,因此必须在3.0下部署),我发现闲置计时器要么被忽略,要么不一致。

我的应用程序从iPod库中播放音乐,当音乐正在播放时,它会自动锁定,而不管上述设置如何。但是一旦您解锁它,除非您再次播放音乐,否则它不会再次自动锁定,而在iPhone自动锁定时间设置之后进行锁定。

我很惊讶没有其他人遇到这个问题,因为我想它会影响大量的应用程序。

仅澄清以下几点:
1. 上述代码位于ApplicationDidFinishLaunching中
2. 我知道无论设置如何,在xCode测试时手机都不会自动锁定

如果有人有任何想法,我将非常感激...


你在播放音乐时是否使用了音频会话?我在想,也许当你开始播放音乐时,idleTimerDisabled属性被重置了...也许你的解决方法就是在你开始播放音乐后,在代码中再加一个idleTimerDisabled=YES。 - David Maymudes
谢谢。是的 - 我尝试过了,想着同样的思路。但没有任何改变。 干杯。 - Craig
谢谢!我知道从xCode测试时,无论设置如何,手机都不会自动锁定。我之前并没有意识到这一点,也一直搞不清为什么我的应用程序不允许手机自动锁定。 - filipe
5个回答

16

我们的应用程序使用MPMediaPLayer。在ApplicationFinishedLaunching中,我们还有 idleTimerDisabled=YES 代码,这个代码的作用是禁用自动锁屏,不过如果设备是无线连接的,并且当前已经播放了一个音乐项(或者在应用程序启动时被暂停了),那么这个设置会失效。显然,这一切都与将Settings -> General -> Autolock设置为某个定时值有关。

在我们找到要播放的音乐之后,在另一个代码块中添加idleTimerDisabled=NO,紧接着是idleTimerDisabled=YES,似乎解决了这个问题。只将其设置为YES是不够的...随后的查询始终显示正确的值(YES)...因此,似乎Apple的代码忽略了该值的设置,如果有当前的音乐片段并且它没有被你的代码更改...但是它注意到了值的变化。

所有这些都在iOS 3.0下进行。


嗨Neil - 謝謝你。我實際上剛找到了一個相同的解決方法。如果您設置一個計時器,每30秒將idleTimerDisabled設置為NO,然後YES,它將保持開啟,無論音樂播放設置如何。這有點像駭客攻擊,但它有效! - Craig
我在 iOS 3 中发现了同样的问题,上面的解决方案对我很有用。由于我的应用程序中有音频启动和停止,这会破坏我的空闲计时器设置,所以我设置了一个计时器,每次运行时,都会检查我的应用程序状态,如果我想要保持空闲计时器开启,则关闭后再打开它,否则就关闭它。但在 iOS 4 下,我发现在循环中关闭空闲计时器会阻止设备进入空闲模式!因此,我不得不调整我的代码,只关闭一次空闲计时器,而不是每次通过循环。 - arlomedia

3
即使在使用iOS 8.2的2015年,这个bug仍然存在。
以下是我的解决方案,使用XCode 6.2。
基本上,即使现在,在2015年,确保设备不休眠的唯一安全方法是重复调用一段代码以保持设备处于唤醒状态。
参考链接:iPhone - phone goes to sleep even if idleTimerDisabled is YES
-(void)callEveryTwentySeconds
{
    //  DON'T let the device go to sleep during our sync
    [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
    [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
}

0

我开发了Seconds - Interval Timer for iPhone and iPod touch,但是这个应用程序一直给我带来麻烦。我的应用程序的想法是人们可以创建基于多个时间间隔的计时器,每个时间间隔都可以播放自己的播放列表或曲目。

在iOS3中,我遇到了一个问题,我无法通过设置idleTimerDisabled = YES来禁用空闲计时器。最后,我想出了与Neil相同的解决方案,即定期将其设置为NO,然后立即再次设置为YES。这似乎有效。

我现在正在将应用程序更新到iOS4(我知道,iOS5就要来了...),现在我有了相反的问题。如果MPMediaPlayer在空闲计时器达到其限制之前更改曲目,则会重置它。我刚刚通过在我的应用程序中创建一个持续55秒的时间间隔进行了测试,我的自动锁定设置为一分钟。在50秒时,屏幕变暗以准备锁定,但在55秒时,当音乐更改时,它恢复了全亮度,然后没有像应该那样锁定。

总体而言,这种实现方式似乎不太可靠。


0

听起来像是一个 bug,需要向 Radar 提交文件 - 我并不太惊讶这种情况很少见,因为可能没有很多应用程序尝试将屏幕锁定并播放音乐。


是的 - 我觉得这可能是一个漏洞 - 我会提交报告。谢谢。 - Craig

0

遇到了同样的问题。当设备插入时,它可以正常工作。您可以按顶部的锁定按钮,稍后我的NSTimer会触发并引起震动。但是,如果设备未插入,则按锁定按钮会使设备进入睡眠状态。非常感谢任何解决方案。

  • iCodeblog发布了有关idletimer的帖子,我说它不起作用,而开发“可爱时钟”的人很好心地回复了。您必须使用NSTimer每10秒或更长时间播放1秒或更长时间的静音声音来进行黑客攻击。即使用户按下锁定按钮,这也会使设备保持唤醒状态。

1
嗨 - 不要忘记,当连接到XCode时,设备不会进入睡眠状态 - 这并不意味着idleTimer命令正在起作用。尽管目前似乎还没有解决方案。 - Craig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接