Что происходит с iPhone-приложением, когда iPhone переходит в режим ожидания?
В моем приложении используется NSTimer, и кажется, что NSTimer не запускается, когда iPhone переходит в режим ожидания (либо нажатием аппаратной кнопки, либо таймером времени ожидания).
Когда я снова активирую iPhone, мое приложение все еще находится на переднем плане. Что происходит с сторонними приложениями, когда iPhone является резервным?
Ответы
Ответ 1
Хотя это не очевидно здесь, я считаю, что оригинальный плакат нашел ответ на свой вопрос, начав нить (доступный здесь) в iPhone Developer Forums (который мне в конечном итоге пришлось найти, потому что информация здесь не была предоставлена).
В случае, если кто-то другой имеет тот же вопрос и находит страницу в будущем, здесь полезный ответ, который был опубликован кем-то на форуме Apple под названием "eskimo1" (который я немного отредактировал, так что его легче читать без с контекстом, предоставленным всем исходным потоком):
- Что касается терминологии статуса приложения iPhone, "активный" не означает "бодрствование", это означает "привязанный к графическому интерфейсу". Подумайте, что он аналогичен "самой передней" в Mac OS X. Когда вы блокируете устройство, приложение отключается, но устройство может или не может заснуть.
- iPhone OS редко спит, если устройство подключено к основной мощности (то есть через USB). Однако он может спать, если работает от батареи.
- Через короткое время после блокировки экрана (20 секунд согласно Оливеру Дробнику) устройство спит. Это похоже на закрытие крышки на вашем ноутбуке; вся активность на основном CPU останавливается.
- Этого не происходит, если устройство воспроизводит аудио в правильном сеансе аудио. Подробнее см. DTS Q & A QA1626 "Аудиозапись - обеспечение воспроизведения звука продолжается, когда экран заблокирован" .
- Обратите внимание, что свойство idleTimerDisabled (которое может быть включено для предотвращения выключения экрана во время работы приложения) означает блокировку экрана после бездействия пользователя. Он не связан напрямую с системным сном (он косвенно связан с тем, что система может спать вскоре после его блокировки).
Ответ 2
См. "Прерывания приложений" в руководстве по программированию на iPhone, особенно события applicationWillResignActive
и applicationDidBecomeActive
. (Весь гид, безусловно, стоит прочитать.) Когда вы игнорируете события, таймер, кажется, продолжается некоторое время, а затем останавливается. Звучит логично, приложение может легко разрядить аккумулятор, если он работает. И что именно происходит с приложением? Я предполагаю, что он просто не получает никакого процессорного времени - он зависает и только оттаивает, когда вы снова включаете машину. "
Ответ 3
Мой первый совет - не отключать таймер простоя, это просто взломать. Если вы хотите сохранить таймер в течение событий пользовательского интерфейса, запустите таймер в текущем цикле выполнения, используя 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];
Ответ 4
Недавно я столкнулся с этой проблемой в приложении, над которым я работаю, которое использует несколько таймеров и воспроизводит некоторые звуковые подсказки и делает две относительно простые изменения:
-
В 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 и Ссылка на класс NSApplication в документе API (доступный через Xcode, просто выполните поиск applicationWillBecomeActive
).
-
Сделал основной viewcontroller
класс a AVAudioPlayerDelegate
и использовал этот код из образца Apple "AddMusic", чтобы звуковые оповещения о том, как приложение хорошо воспроизводилось в iPod audio и т.д....
Я просто отбросил этот код в метод, который вызывается во время viewDidLoad. Если это вас интересует, вы попадаете в категорию "кто должен читать этот документ": Руководство по программированию аудиозаписей
// 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];
Ответ 5
Я использовал информацию на этом посту для небольшого образца, который я строил. Это код, который я использовал, когда я начал воспроизведение, чтобы предотвратить остановку звука:
AudioSession.Category = AudioSessionCategory.MediaPlayback;
И когда приложение выполняется с воспроизведением до reset до исходного значения:
AudioSession.Category = AudioSessionCategory.SoloAmbientSound;
Полный образец находится здесь:
http://github.com/migueldeicaza/monotouch-samples/tree/master/StreamingAudio/
Ответ 6
Я считаю, что ваше приложение должно нормально работать при приостановке. (думаю, радио Pandora)
Проверьте, не отключен ли ваш таймер из-за скрытия вашего представления или какого-либо другого события.