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

StackOverflow https://stackoverflow.com/questions/411436

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Мой первый совет: не отключайте таймер простоя, это просто взлом. Если вы хотите сохранить таймер во время событий пользовательского интерфейса, запустите таймер в текущем цикле выполнения, используя 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/ дерево / ведущий / 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 & amp; Ссылка на класс NSApplication в API Документ (доступный через XCode, просто найдите applicationWillBecomeActive ).

  • Сделал основной 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];
    
  • Я полагаю, что ваше приложение должно работать нормально, когда оно приостановлено. (думаю, Пандора Радио)

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

    scroll top