Pergunta

Esta é a seção do CllocationManager documentação descrevendo o comportamento do aplicativo com StartMonitoringSignificantLocationChanges:

Se você iniciar este serviço e seu aplicativo for encerrado posteriormente, o sistema relançará automaticamente o aplicativo em segundo plano se um novo evento chegar. Nesse caso, o dicionário de opções passou para o aplicativo: DidfinishlaunchingWithOptions: o método do seu delegado de aplicativo contém o principal uiapplicationLationLaunchOptionsLocationKey para indicar que seu aplicativo foi lançado devido a um evento de localização. Após o relançamento, você ainda deve configurar um objeto de gerente de localização e chamar esse método para continuar recebendo eventos de localização. Ao reiniciar os serviços de localização, o evento atual é entregue ao seu delegado imediatamente. Além disso, a propriedade de localização do objeto do seu gerente de localização é preenchida com o objeto de localização mais recente antes de iniciar os serviços de localização.

Então, meu entendimento é que se o seu aplicativo termina (e presumo que se você não ligar StopMonitoringSignificantLocationChanges a partir de ApplicationWiltterinate) você será acordado com um UiapplicationLaunchOptionsLocationKey parâmetro para Aplicação: DidfinishlaunchingWithOptions. Nesse ponto você cria o seu CllocationManager, ligar StartMonitoringSignificantLocationChanges e faça o seu processamento de localização em segundo plano para um tempo limitado. Então, estou bem com esse pouco.

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:

As atualizações de localização do aplicativo em segundo plano foram eliminadas e agora foram relançadas. Nesse caso, o dicionário contém uma chave indicando que o aplicativo foi relançado devido a um novo evento de localização.

Sugerindo que você receberá apenas essa chamada quando o aplicativo for iniciado (devido a uma mudança de local) após o término do terminado.

No entanto, o parágrafo no Serviço de mudança significativa no Guia de programação de conscientização sobre localização tem o seguinte a dizer:

Se você deixar este serviço em execução e seu aplicativo será suspenso ou terminado posteriormente, o serviço acorda automaticamente seu aplicativo quando os novos dados de localização chegarem. Na hora de despertar, seu aplicativo é colocado em segundo plano e, com uma pequena quantidade de tempo para processar os dados do local. Como seu aplicativo está em segundo plano, ele deve realizar um trabalho mínimo e evitar tarefas (como consultar a rede) que podem impedir que ele retorne antes que o tempo alocado expire. Caso contrário, seu aplicativo pode ser encerrado.

Isso sugere que você está acordado com dados de localização se o seu aplicativo foi suspenso, mas não mencionar como você está acordado:

  • Faz o UiapplicationDelegate Obtenha um retorno de chamada me dizendo que estou retomando de um estado suspenso em um estado de fundo?
  • O gerenciador de localização (que estava liofilizado quando o aplicativo foi suspenso) começa a receber LocationManager: DidUpDateTolocation: FromLocation retornos de chamada?
  • Eu só preciso implementar código no meu didUpDateTetolocation mensagem que verifica o estado do aplicativo e faz processamento mínimo se no modo de fundo?

No processo de escrever isso, acho que posso ter respondido à minha própria pergunta, mas seria ótimo ter meu entendimento disso confirmado por alguém mais experiente.

Foi útil?

Solução

Desde que fiz essa pergunta, fiz um pouco de teste (principalmente no trem entre casa e trabalho) e confirmei que o comportamento para aplicativos suspensos é como eu suspeitava no final da pergunta.

Ou seja, seu aplicativo suspenso é acordado, você não recebe nenhum retorno de chamada no seu delegado de aplicativo; em vez disso, recebe suas atualizações de localização através de sua existência existente CllocationManagerDelegate. Você pode detectar que está correndo em segundo plano, verificando o ApplicationState, e faça um trabalho limitado para o caso em que você é acordado de um estado suspenso para fazer processamento de localização.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

Cheguei a esta conclusão com um chicote de teste de localização para o qual você pode ser bem -vindo download e experimente. É um aplicativo bastante simples que permite ativar alterações significativas e alterações de GPS APIs através da interface do usuário e registrem todas as respostas que você recebe de volta.

Nb O ponto seis na resposta anterior não está correto. Congelamento seco Aplicativos suspensos recebem CllocationManagerDelegate retornos de chamada quando são acordados de um estado suspenso.

Outras dicas

Meu entendimento é o seguinte (estou escrevendo um aplicativo que depende dessa API, mas não concluí esse componente o suficiente para começar a testar):

  1. Seu aplicativo é executado pela primeira vez, você se registra para StartMonitoringSignificantLocationChanges, e fornecer uma função de retorno de chamada. Enquanto seu aplicativo estiver em execução, ele chamará esse retorno de chamada sempre que receber uma alteração significativa.
  2. Se o seu aplicativo for colocado em segundo plano, a UIApplicação receberá ApplicationWillResignActive, Seguido por ApplicationDIDERBackground.
  3. Se o seu aplicativo for morto enquanto estiver suspenso em segundo plano, você não será notificado; No entanto, se o seu aplicativo for morto enquanto estiver em execução (em primeiro plano ou plano de fundo para meu conhecimento), você terá um momento com ApplicationWiltterinate. Você não pode solicitar tempo de fundo extra desta função.
  4. Apesar de ter sido morto em segundo plano, o sistema operacional relançará sua aplicação. Se o seu aplicativo for simplesmente lançado pelo sistema operacional para variar, você receberá uma chamada para Application didfinishlaunchingWithOptions:

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

    Ajudará você a determinar se você voltou de uma mudança de local em segundo plano.

  5. Se, em vez disso, você estivesse em execução atualmente em segundo plano e seu aplicativo for relançado manualmente pelo usuário, você receberá um ApplicationWillenterForEground Seguido por ApplicationDidBecomeActive.
  6. Independentemente de como aconteceu, quando seu aplicativo é relançado (a menos que ainda estivesse em segundo plano como resultado de uma tarefa de segundo plano e a tarefa tivesse começado a monitorar as mudanças), você precisa dizer explicitamente para isso StartMonitoringSignificantLocationChanges Novamente, porque o retorno de chamada não está mais preso após a "secagem congelada". E sim, você só precisa implementar o código no DidUpDatetolocation depois de se recuperar um manipulador de localização de algum tipo, uma vez voltando do estado suspenso.

É isso que estou acontecendo com meu desenvolvimento de código agora. Como mencionei antes, não estou pronto para testar isso em um dispositivo, então não sei dizer se interpretei tudo corretamente, então comentaristas, por favor, fique à vontade para me corrigir (embora eu tenha feito leitura substancial sobre o tema).

Ah, e se, por algum golpe de azar, você lançará um aplicativo que faz o que eu quero que o meu faça, posso chorar :)

Boa sorte!

Se o aplicativo for evocado do estado suspenso como resultado do aplicativo de alteração do local será lançado no estado em segundo plano.

Todos os objetos estarão ao vivo e você receberá a atualização de localização no delegado existente.

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