Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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)

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