24

我的应用程序使用 NSTimer,当 iPhone 进入待机模式(通过按下硬件按钮或空闲计时器)时,NSTimer 似乎不会触发。

当我再次激活 iPhone 时,我的应用程序仍在前台。当 iPhone 处于待机模式时,第三方应用程序会发生什么?

4

6 回答 6

46

虽然在这里并不明显,但我相信原始发帖人确实通过在 iPhone 开发者论坛中启动一个线程(可在此处获得)找到了他的问题的答案(我最终不得不找到自己,因为信息未在此处共享)。

如果其他人有同样的问题并在将来找到该页面,这里有一个有用的回复,由 Apple 论坛上的某个人发布,名为“eskimo1”(我对其进行了轻微编辑,以便在没有上下文的情况下更容易阅读由整个原始线程提供):

  • 关于 iPhone 应用程序状态术语,“活动”并不意味着“唤醒”,它意味着“附加到 GUI”。认为它类似于 Mac OS X 中的“最前面”。当您锁定设备时,您的应用程序会停用,但设备可能会或可能不会进入睡眠状态
  • 如果设备连接到主电源(即通过 USB),iPhone OS 很少休眠。但是,如果使用电池运行,它可以休眠。
  • 屏幕锁定后的一小段时间(根据 Oliver Drobnik 的说法是 20 秒),设备进入睡眠状态。这就像合上笔记本电脑的盖子一样;主 CPU 上的所有活动都停止。
  • 如果设备在正确的音频会话中播放音频,则不会发生这种情况。有关详细信息,请参阅DTS Q&A QA1626“音频会话 - 确保屏幕锁定时继续播放音频”
  • 请注意,idleTimerDisabled 属性(可以打开以防止在应用程序运行时关闭屏幕)是关于在用户不活动后锁定屏幕。它与系统睡眠没有直接关系(它间接相关,因为系统可能在锁定后不久就进入睡眠状态)。
于 2009-02-05T14:36:54.160 回答
14

请参阅iPhone OS 编程指南中的应用程序中断,尤其是和事件。(整个指南当然值得一读。)当您忽略这些事件时,计时器似乎会持续一段时间然后停止。听起来合乎逻辑,如果继续运行,应用程序很容易耗尽电池电量。应用程序到底发生了什么?我猜它根本没有获得任何 CPU 时间——它会在您重新“打开”机器时冻结并解冻。</p> applicationWillResignActiveapplicationDidBecomeActive

于 2009-01-04T19:34:04.080 回答
3

我的第一个建议是不要禁用空闲计时器,这只是一个 hack。如果您想在 UI 事件期间保持计时器处于活动状态,请使用 NSCommonModes 在当前运行循环上运行计时器:

// create timer and add it to the current run loop using common modes

self.timer = [NSTimer timerWithTimeInterval:.1 target:self selector:@selector(handleTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
于 2009-05-10T23:57:26.443 回答
1

我最近在我正在开发的一个应用程序中遇到了这个问题,该应用程序使用多个计时器并播放一些音频提示并进行了两个相对简单的更改:

  1. AppDelegate我实现了以下方法,并且仅存在允许应用程序在屏幕锁定时继续

    // this receives the notification when the device is locked
    - (void)applicationWillResignActive:(UIApplication *)application
    { 
    }
    
    // this receives the notification that the application is about to become active again
    - (void)applicationWillBecomeActive:(NSNotification *)aNotification
    {
    }
    

    参考: API 文档中的UIApplicationDelegate 协议参考NSApplication 类参考(可通过 Xcode 访问,只需搜索applicationWillBecomeActive)。

  2. 制作主viewcontrollerAVAudioPlayerDelegate并使用 Apple 的“AddMusic”示例中的此代码使应用程序播放的音频警报很好地混合到 iPod 音频等中......

    我只是将此代码放入 viewDidLoad 期间调用的方法中。如果您对此感兴趣,那么您属于“谁应该阅读此文档”类别:Audio Session Programming Guide

    // Registers this class as the delegate of the audio session.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // The AmbientSound category allows application audio to mix with Media Player
    // audio. The category also indicates that application audio should stop playing 
    // if the Ring/Siilent switch is set to "silent" or the screen locks.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Activates the audio session.
    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
    
于 2009-12-01T13:52:36.593 回答
1

我将这篇文章中的信息用于我正在构建的一个小样本。这是我在启动播放以防止音频停止时使用的代码:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

当应用程序完成播放以重置为原始值时:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

完整样本在这里:

http://github.com/migueldeicaza/monotouch-samples/tree/master/StreamingAudio/

于 2010-01-08T07:06:03.207 回答
0

我相信您的应用程序在暂停时应该可以正常运行。(想想潘多拉电台)

检查您的计时器是否由于您的视图被隐藏或发生其他事件而被取消分配。

于 2009-01-14T06:04:17.057 回答