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

view.snapshotView (afterScreenUpdates: true)

24
задан miguel.de.icaza 8 January 2010 в 07:06
поделиться

6 ответов

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

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

  • Относительно терминологии состояния приложения для iPhone, "активной", не означает "не спящий", это означает "подключенный к GUI". Думайте о нем походящий "frontmost" в Mac OS X. При блокировке устройства приложение деактивируется, но устройство может или не может заснуть
  • , iPhone OS редко спит, если устройство подключено к основному питанию (т.е. через USB). Это может спать, работая от батареи, как бы то ни было.
  • короткое время А после того, как экран заблокирован (20 секунд по словам Oliver Drobnik), сны устройства. Это похоже на закрытие крышки на Вашем ноутбуке; все действие по основным остановам ЦП.
  • Этого не происходит, если устройство играет аудио на правильной аудио сессии. См. DTS Q& QA1626 "Аудио Сессия - Гарантирующий воспроизведение звука продолжается, когда экран заблокирован" для деталей.
  • Примечание, что idleTimerDisabled свойство (который может быть включен, чтобы препятствовать тому, чтобы экран выключил, в то время как приложение работает) о блокировке экрана после пользовательской неактивности. Это непосредственно не связано с системным сном (это косвенно связано, в котором может спать система вскоре после того, как это заблокировано).
46
ответ дан Clint Harris 28 November 2019 в 22:38
поделиться

См. Прерывания работы приложений в Руководство по программированию iPhone OS , особенно applicationWillResignActive и applicationDidBecomeActive события. (Целое руководство, конечно, стоит прочитать.) При игнорировании событий таймер, кажется, продолжается некоторое время и затем останавливается. Звучит логичным, приложение могло легко истощить батарею, если продолжается управлять. И что точно происходит с приложением? Я предполагаю, что это просто не получает процессорного времени †“, это замораживается и только тает при возвращении машины “on. ”

14
ответ дан zoul 28 November 2019 в 22:38
поделиться

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

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

0
ответ дан Adam Douglass 28 November 2019 в 22:38
поделиться

Мой первый совет - не отключайте таймер простоя, это просто взлом. Если вы хотите, чтобы таймер работал во время событий пользовательского интерфейса, запустите таймер в текущем цикле выполнения, используя 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];
3
ответ дан 28 November 2019 в 22:38
поделиться

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

  1. В AppDelegate Я реализовал следующие методы, и простое присутствие позволяет приложению продолжать работу, когда экран заблокирован

     // он получает уведомление, когда устройство заблокировано
    - (void) applicationWillResignActive: (UIApplication *) приложение
    { 
    }
    
    // получит уведомление о том, что приложение снова станет активным
    - (void) applicationWillBecomeActive: (NSNotification *) aNotification
    {
    }
    

    ссылки: Ссылка на протокол UIApplicationDelegate и Ссылка на класс NSApplication в документе API (доступный через Xcode, просто найдите applicationWillBecomeActive ).

  2. Сделал main viewcontroller class an AVAudioPlayerDelegate и использовал этот код из примера Apple "AddMusic", чтобы звуковые оповещения, воспроизводимые приложением, хорошо смешивались со звуком iPod и т. д.

    Я просто сбросил этот код в метод, который вызывается во время viewDidLoad. Если вас это интересует, вы попадаете в категорию «кто должен прочитать этот документ» для этого: Руководство по программированию аудиосессии

     // Регистрирует этот класс как делегат аудиосессии.
    [[AVAudioSession sharedInstance] setDelegate: self];
    
    // Категория AmbientSound позволяет микшировать звук приложения с Media Player
    // аудио. Категория также указывает, что звук приложения должен перестать воспроизводиться
    // если переключатель Ring / Siilent установлен в положение «без звука» или экран блокируется.
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];
    
    // Активирует аудиосеанс.
    NSError * ActivationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: & activationError];
    
1
ответ дан 28 November 2019 в 22:38
поделиться

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

AudioSession.Category = AudioSessionCategory.MediaPlayback;

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

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

Полный пример здесь:

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

1
ответ дан 28 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: