Esta é a seção da documentação CLLocationManager que descreve o comportamento do aplicativo com startMonitoringSignificantLocationChanges :
Se você iniciar este serviço e seu aplicativo for encerrado posteriormente, o sistema reiniciará automaticamente o aplicativo em segundo plano se um novo evento chegar. Nesse caso, o dicionário de opções passado para o aplicativo: didFinishLaunchingWithOptions: método do delegado do seu aplicativo contém a chave UIApplicationLaunchOptionsLocationKey para indicar que seu aplicativo foi iniciado devido a um evento de localização. Após a reinicialização, você ainda deve configurar um objeto gerenciador de localização e chamar esse método para continuar recebendo eventos de localização. Quando você reinicia os serviços de localização, o evento atual é entregue ao seu delegado imediatamente. Além disso, a propriedade de localização de seu objeto de gerenciador de localização é preenchida com o objeto de localização mais recente, mesmo antes de iniciar os serviços de localização.
Portanto, meu entendimento é que se seu aplicativo for encerrado (e eu presumo que se você não chamar stopMonitoringSignificantLocationChanges de applicationWillTerminate ), você será ativado com um parâmetro UIApplicationLaunchOptionsLocationKey para o aplicativo: didFinishLaunchingWithOptions . Nesse ponto, você cria seu CLLocationManager , chama startMonitoringSignificantLocationChanges e faz o processamento de localização em segundo plano por um tempo limitado . Então estou bem com essa parte.
O parágrafo anterior fala apenas sobre o que acontece quando o aplicativo é encerrado, não sugere o que você faz quando o aplicativo é suspenso. A documentação para didFinishLaunchingWithOptions diz:
O aplicativo rastreia as atualizações de localização em segundo plano, foi eliminado e agora foi reiniciado. Nesse caso, o dicionário contém uma chave indicando que o aplicativo foi reiniciado devido a um novo evento de localização.
Sugerindo que você só receberá esta chamada quando seu aplicativo for iniciado (devido a uma mudança de local) após ter sido encerrado.
No entanto, o parágrafo sobre o Serviço de Mudança Significativa no Guia de Programação de Conscientização de Localização tem o seguinte a dizer:
Se você deixar este serviço em execução e seu aplicativo for suspenso ou encerrado, o serviço ativará automaticamente seu aplicativo quando novos dados de localização chegarem. Na hora de despertar, seu aplicativo é colocado em segundo plano e recebe um pequeno período de tempo para processar os dados de localização. Como seu aplicativo está em segundo plano, ele deve fazer o mínimo de trabalho e evitar quaisquer tarefas (como consultar a rede) que possam impedir que ele retorne antes que o tempo alocado expire. Caso contrário, seu aplicativo pode ser encerrado.
Isso sugere que você acordou com dados de localização se seu aplicativo foi suspenso, mas não menciona como você acordou:
- O UIApplicationDelegate recebe um retorno de chamada informando que estou retomando de um estado suspenso para um estado de segundo plano?
- O gerenciador de localização (que foi congelado quando o aplicativo foi suspenso) começa a receber callbacks de locationManager: didUpdateToLocation: fromLocation ?
- Preciso apenas implementar o código em minha mensagem didUpdateToLocation que verifica o estado do aplicativo e faz o processamento mínimo se estiver no modo de segundo plano?
No processo de escrever isso, acho que posso ter respondido minha própria pergunta, mas seria ótimo ter meu entendimento sobre isso confirmado por alguém mais experiente.
fonte
didExitRegion
retorno de chamada, mas não conseguistartLocationUpdates
de lá, porque não foi através do lançamento do aplicativo ...Meu entendimento é o seguinte (estou no processo de escrever um aplicativo que depende dessa API, mas não concluí este componente o suficiente para começar o teste):
Apesar de ser morto em segundo plano, o sistema operacional irá reiniciar seu aplicativo. Se o seu aplicativo for simplesmente iniciado pelo sistema operacional para uma mudança, você receberá uma chamada para o aplicativo didFinishLaunchingWithOptions :
irá ajudá-lo a determinar se você voltou de uma mudança de localização em segundo plano.
Independentemente de como isso aconteceu, quando seu aplicativo for reiniciado (a menos que ainda estivesse em execução em segundo plano como resultado de uma tarefa em segundo plano e a referida tarefa tivesse iniciado o monitoramento de alterações), você precisa dizer explicitamente para iniciarMonitoringSignificantLocationChanges novamente porque o retorno de chamada não mais anexado após a "liofilização". E sim, você só precisa implementar o código em didUpdateToLocation depois de reconectar um manipulador de localização de algum tipo, ao retornar do estado suspenso.Isso é o que estou fazendo com meu desenvolvimento de código agora. Como mencionei antes, não estou totalmente pronto para testar isso em um dispositivo, então não posso dizer se interpretei tudo corretamente, portanto, comentadores, sintam-se à vontade para me corrigir (embora eu tenha feito uma leitura substancial no tópico).
Ah, e se por um golpe de azar você lançar um aplicativo que faz o que eu quero que o meu faça, posso chorar :)
Boa sorte!
fonte
Se o aplicativo for acionado do estado suspenso como resultado da mudança de local, o aplicativo será iniciado em segundo plano.
Todos os objetos estarão ativos e você receberá atualização de localização no delegado existente.
fonte