【发布时间】:2009-01-04 18:23:37
【问题描述】:
我的应用使用 NSTimer,当 iPhone 进入待机模式(通过按下硬件按钮或空闲计时器)时,NSTimer 似乎不会触发。
当我再次激活 iPhone 时,我的应用程序仍在前台。当 iPhone 处于待机模式时,第三方应用会发生什么情况?
【问题讨论】:
标签: iphone cocoa-touch xamarin.ios
我的应用使用 NSTimer,当 iPhone 进入待机模式(通过按下硬件按钮或空闲计时器)时,NSTimer 似乎不会触发。
当我再次激活 iPhone 时,我的应用程序仍在前台。当 iPhone 处于待机模式时,第三方应用会发生什么情况?
【问题讨论】:
标签: iphone cocoa-touch xamarin.ios
虽然这里不明显,但我相信原始发帖人确实通过在 iPhone 开发者论坛中发起一个线程 (available here) 找到了他的问题的答案(我最终不得不找到自己,因为信息没有共享在这里)。
如果其他人有同样的问题并在将来找到该页面,这里有一个有用的回复,该回复由 Apple 论坛上的某个人发布,名为“eskimo1”(我对其进行了轻微编辑,以便在没有的情况下更容易阅读具有由整个原始线程提供的上下文):
【讨论】:
请参阅iPhone OS 编程指南中的应用程序中断,尤其是applicationWillResignActive 和applicationDidBecomeActive 事件。 (整个指南当然值得一读。)当您忽略事件时,计时器似乎会持续一段时间然后停止。听起来合乎逻辑,如果继续运行,应用程序很容易耗尽电池电量。应用程序到底发生了什么?我猜它根本没有得到任何 CPU 时间——它会在你重新“打开”机器时冻结并解冻。
【讨论】:
我的第一个建议是不要禁用空闲计时器,这只是一个 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];
【讨论】:
我将这篇文章中的信息用于我正在构建的一个小样本。这是我在启动播放以防止音频停止时使用的代码:
AudioSession.Category = AudioSessionCategory.MediaPlayback;
当应用程序完成播放后重置为原始值:
AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
完整示例在这里:
http://github.com/migueldeicaza/monotouch-samples/tree/master/StreamingAudio/
【讨论】:
我最近在我正在开发的一个应用程序中遇到了这个问题,该应用程序使用多个计时器并播放一些音频提示并进行了两个相对简单的更改:
在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)。
将主要的 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];
【讨论】:
我相信您的应用程序在暂停时应该可以正常运行。 (想想潘多拉电台)
检查您的计时器是否由于您的视图被隐藏或发生其他事件而被释放。
【讨论】: