Pergunta

Meu aplicativo usa NSTimer e parece que NSTimer não dispara quando o iPhone entra no modo stand-by (premindo o botão de hardware ou pelo temporizador de inactividade).

Quando eu ativar o iPhone novo, meu aplicativo ainda está em primeiro plano. O que acontece com aplicativos de terceiros quando o iPhone é o modo stand-by?

Foi útil?

Solução

Embora não seja evidente aqui, eu acredito que o poster original fez encontrar uma resposta para sua pergunta, iniciando uma rosca ( disponível aqui ) no Developer Fórum do iPhone (que eu tive de me encontrar porque a informação não foi compartilhada aqui).

No caso de alguém tem a mesma pergunta e encontra a página no futuro, aqui está uma resposta útil que foi publicado por alguém no fórum da Apple chamado "eskimo1" (que eu tenho ligeiramente editado de tal forma que é mais fácil de ler sem tendo o contexto fornecido por todo o segmento original):

  • Em relação à terminologia status de aplicativo para iPhone, "ativo" não significa "despertar", que significa "ligado à GUI". Pense nisso sendo análogo ao "primeiro plano" no Mac OS X. Quando você bloquear o dispositivo seus desativa app mas o dispositivo pode ou não pode ir dormir
  • iPhone OS raramente dorme, se o dispositivo está conectado à alimentação principal (ou seja, via USB). Ele pode dormir, se funcionar com bateria, no entanto.
  • Um curto espaço de tempo depois de a tela está bloqueada (20 segundos de acordo com Oliver Drobnik), os sonos dispositivo. Isto é como fechar a tampa em seu laptop; toda a atividade nas principais paradas da CPU.
  • Isto não acontecer se o dispositivo estiver a reproduzir áudio na sessão de áudio direito. Consulte DTS Q & A QA1626 "Sessão de áudio - Assegurar a reprodução de áudio continua quando a tela está bloqueada" para mais detalhes.
  • Observe que a propriedade idleTimerDisabled (que pode ser ativado para impedir que a tela se desligue enquanto o aplicativo está sendo executado) é de cerca de bloquear a tela após inactividade. Não está diretamente relacionado com o sono do sistema (é indirectamente relacionados em que o sistema pode dormir logo após ele está bloqueado).

Outras dicas

Veja Aplicação Interrupções iPhone OS Guia de Programação , especialmente os eventos applicationWillResignActive e applicationDidBecomeActive. (Toda a guia é certamente vale a pena ler.) Quando você ignora os eventos, o temporizador parece continuar por um tempo e depois pára. Parece lógico, o aplicativo poderia facilmente descarregar a bateria se continuou correndo. E o que exatamente acontece com a aplicação? Eu acho que ele simplesmente não recebe qualquer tempo de CPU - “em” congela e só derrete quando você ligar a máquina de volta

Meu primeiro conselho é não desativar o temporizador de inactividade, que é apenas um hack. Se você quiser manter um temporizador vivo durante eventos de interface executar o timer no loop de execução atual usando 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];

Eu usei as informações sobre este post para uma pequena amostra que eu estava construindo. Este é o código que eu usei quando iniciou a reprodução para evitar o áudio de parar:

AudioSession.Category = AudioSessionCategory.MediaPlayback;

E quando a aplicação é feita com a reprodução para repor o valor original:

AudioSession.Category = AudioSessionCategory.SoloAmbientSound;

A amostra completa está aqui:

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

fui confrontado com esta questão recentemente em um aplicativo que eu estou trabalhando em que utiliza vários temporizadores e desempenha algumas instruções de áudio e fez duas alterações relativamente simples:

  1. No AppDelegate eu implementei os seguintes métodos e não mera presença permite que o aplicativo para continuar quando a tela está bloqueada

    // 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
    {
    }
    

    referências: UIApplicationDelegate Protocolo de Referência & NSApplication Classe Referência no doc API (acessível através Xcode, basta procurar por applicationWillBecomeActive).

  2. Feito a classe principal viewcontroller um AVAudioPlayerDelegate e usei esse código de amostra "AddMusic" da Apple para fazer os alertas de áudio do aplicativo jogado misturar muito bem no iPod de áudio etc ...

    Eu só caiu este código em um método que é chamado durante viewDidLoad. Se isto lhe interessa, você cair na "quem deve ler este doc" categoria para isso: sessão de áudio guia de programação

    // 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];
    

Eu acredito que a sua aplicação deve funcionar normalmente quando suspenso. (Pense Pandora Radio)

Verifique se o seu temporizador está sendo desalocada devido à sua visão sendo escondido ou algum outro evento que ocorre.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top