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.