Что происходит с приложением iPhone, когда iPhone переходит в режим ожидания? - PullRequest
24 голосов
/ 04 января 2009

Мое приложение использует NSTimer, и кажется, что NSTimer не срабатывает, когда iPhone переходит в режим ожидания (нажатием аппаратной кнопки или таймером ожидания).

Когда я снова активирую iPhone, мое приложение все еще находится на переднем плане. Что происходит со сторонними приложениями, когда iPhone находится в режиме ожидания?

Ответы [ 6 ]

46 голосов
/ 05 февраля 2009

Хотя здесь это не очевидно, я полагаю, что оригинальный постер нашел ответ на свой вопрос, начав тему ( доступна здесь ) на форумах разработчиков iPhone (которые мне в итоге пришлось найти, потому что информация не была передана здесь).

В случае, если у кого-то еще возникнет тот же вопрос и он найдет страницу в будущем, вот полезный ответ, который кто-то опубликовал на форуме Apple под названием "eskimo1" (который я немного отредактировал так, что его легче читать без с контекстом, предоставленным всей исходной веткой):

  • Что касается терминологии статуса приложения iPhone, «активный» не означает «активный», он означает «подключенный к графическому интерфейсу». Представьте себе, что это аналог «переднего» в Mac OS X. Когда вы блокируете устройство, ваше приложение деактивируется, но устройство может или не может перейти в спящий режим
  • iPhone OS редко спит, если устройство подключено к основному источнику питания (т.е. через USB). Однако он может спать, если работает от батареи.
  • Через некоторое время после блокировки экрана (20 секунд, по словам Оливера Дробника) устройство отключается. Это похоже на закрытие крышки на вашем ноутбуке; вся деятельность на главном процессоре останавливается.
  • Этого не происходит, если устройство воспроизводит звук во время правильного аудио сеанса. См. DTS Q & A QA1626 «Аудио сеанс - обеспечение воспроизведения аудио продолжается, когда экран заблокирован» для получения подробной информации.
  • Обратите внимание, что свойство idleTimerDisabled (которое можно включить для предотвращения отключения экрана во время работы приложения) касается блокировки экрана после неактивности пользователя. Он не имеет прямого отношения к сну системы (он косвенно связан с тем, что система может находиться в спящем режиме вскоре после блокировки).
14 голосов
/ 04 января 2009

См. Прерывания работы приложения в Руководстве по программированию iPhone OS , особенно события applicationWillResignActive и applicationDidBecomeActive. (Целое руководство, безусловно, заслуживает прочтения.) Когда вы игнорируете события, кажется, что таймер включается на некоторое время, а затем останавливается. Звучит логично, приложение может легко разрядить аккумулятор, если продолжать работу. А что именно происходит с приложением? Я думаю, он просто не получает никакого времени процессора - он зависает и оттаивает только тогда, когда Вы снова включаете машину.

3 голосов
/ 11 мая 2009

Мой первый совет: не отключайте таймер простоя, это просто взлом. Если вы хотите сохранить таймер во время событий пользовательского интерфейса, запустите таймер в текущем цикле выполнения, используя 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];
1 голос
/ 08 января 2010

Я использовал информацию из этого поста для небольшого образца, который я строил. Это код, который я использовал при запуске воспроизведения для предотвращения остановки звука:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

И когда приложение завершено с воспроизведением, чтобы сбросить до исходного значения:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

Полный образец здесь:

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

1 голос
/ 01 декабря 2009

Недавно я столкнулся с этой проблемой в приложении, над которым я работаю, которое использует несколько таймеров, воспроизводит некоторые звуковые подсказки и внесло два относительно простых изменения:

  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 & Ссылка на класс NSApplication в документе API (доступ через XCode, просто поиск applicationWillBecomeActive).

  2. Сделал основной viewcontroller класс AVAudioPlayerDelegate и использовал этот код из примера Apple «AddMusic», чтобы звуковые оповещения, которые воспроизводилось приложением, хорошо смешивались с аудио iPod и т. Д. *

    Я только что уронил этот код в метод, который вызывается во время 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];
    
0 голосов
/ 14 января 2009

Я считаю, что ваше приложение должно работать нормально, когда оно приостановлено. (думаю, Пандора Радио)

Проверьте, не отключен ли ваш таймер из-за того, что ваше представление скрыто или произошло какое-то другое событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...