【问题标题】:What happens to an iPhone app when iPhone goes into stand-by mode?当手机进入待机模式时,iPhone 应用程序会发生什么?
【发布时间】:2009-01-04 18:23:37
【问题描述】:

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

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

【问题讨论】:

    标签: iphone cocoa-touch xamarin.ios


    【解决方案1】:

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

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

    • 关于 iPhone 应用程序状态术语,“活动”并不意味着“唤醒”,它意味着“附加到 GUI”。认为它类似于 Mac OS X 中的“最前端”。当您锁定设备时,您的应用会停用,但设备可能会或可能不会进入睡眠状态
    • 如果设备连接到主电源(即通过 USB),iPhone OS 很少休眠。但是,如果使用电池运行,它可以休眠。
    • 屏幕锁定后的短时间内(根据 Oliver Drobnik 的说法是 20 秒),设备进入睡眠状态。这就像合上笔记本电脑的盖子一样;主 CPU 上的所有活动都会停止。
    • 如果设备在正确的音频会话中播放音频,则不会发生这种情况。详情请见DTS Q&A QA1626 "Audio Session - Ensuring audio playback continues when screen is locked"。
    • 请注意,idleTimerDisabled 属性(可以打开以防止在应用程序运行时关闭屏幕)是关于在用户不活动后锁定屏幕。它与系统睡眠没有直接关系(它的间接关系是系统可能会在锁定后不久进入睡眠状态)。

    【讨论】:

    • 谢谢克林特。我打算在这里发布一个指向该主题的链接,但一直没有时间去做。
    • 克林特,这很有用。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。对 iPhone 编程指南的参考帮助我理解了发生了什么。
    • 这两种方法我都实现了,过一会定时器还是停止了。根据指南,应用程序仍会执行,但不会分派事件。当应用处于挂起状态时,有没有办法让计时器继续运行?
    • 我认为它将运行循环置于特殊模式。如果你能弄清楚这个模式是什么,那么你应该能够运行你的计时器。请注意,这是一个完整的猜测
    • 根据指南,应用程序在暂停时不应执行任何操作。尝试相反的做法似乎是让您的应用被拒绝的好方法。
    • @zoul 我阅读指南的方式说,在暂停模式下,应用程序应该使用最少的电池电量,而不是它不应该做任何事情。 AppStore 中的其他应用程序似乎在 iPhone 锁定时启用了某种计时器。我只是不知道他们是怎么做到的。
    【解决方案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];
    

    【讨论】:

    • 您能更深入地解释一下吗?即使在设备睡眠期间,NSCommonModes 如何保持定时器触发?
    • 它不会在设备进入睡眠状态时保持运行,但在 UI 事件期间会保持运行。
    【解决方案4】:

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

    AudioSession.Category = AudioSessionCategory.MediaPlayback;
    

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

    AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
    

    完整示例在这里:

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

    【讨论】:

      【解决方案5】:

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

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

        参考:UIApplicationDelegate Protocol Reference & NSApplication Class Reference 在 API 文档中(可通过 Xcode 访问,只需搜索 applicationWillBecomeActive)。

      2. 将主要的 viewcontroller 类设为 AVAudioPlayerDelegate,并使用 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];
        

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • Pandora 利用了几种声音播放模式中的一种,即使屏幕锁定也能继续运行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 2015-02-15
        • 1970-01-01
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多