Estou acionando uma busca em segundo plano usando o content-available
sinalizador em uma notificação por push. Eu tenho o fetch
e remote-notification
UIBackgroundModes
ativado.
Aqui está a implementação que estou usando no meu AppDelegate.m:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Quando o aplicativo está sendo executado em segundo plano, ele funciona bem. (A notificação é recebida e o aplicativo acionou a notificação local "parece que recebi uma notificação", como o código acima deve fazer).
No entanto, quando o aplicativo não está em execução e uma notificação por push é recebida com o content-available
sinalizador, o aplicativo não é iniciado e o didRecieveRemoteNotification
método delegado nunca é chamado.
O vídeo da WWDC O que há de novo na multitarefa (nº 204 da WWDC 2013) mostra isso:
Ele diz que o aplicativo é "iniciado em segundo plano" quando uma notificação por push é recebida com o content-available
sinalizador.
Por que meu aplicativo não está sendo iniciado em segundo plano?
Portanto, a verdadeira questão é:
O iOS executará tarefas em segundo plano depois que o usuário forçar o encerramento do aplicativo?
fonte
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Respostas:
UPDATE2:
Você pode conseguir isso usando a nova estrutura PushKit, introduzida no iOS 8. Embora o PushKit seja usado para VoIP. Portanto, seu uso deve ser relacionado a VoIP, caso contrário, há risco de rejeição do aplicativo. (Veja esta resposta ).
UDPDATE1:
A documentação foi esclarecida para iOS8 . A documentação pode ser lida aqui . Aqui está um trecho relevante:
Embora isso não tenha sido esclarecido pelo vídeo da WWDC, uma rápida pesquisa nos fóruns de desenvolvedores revelou isso:
https://devforums.apple.com/message/873265#873265 (login obrigatório)
Esse post foi de um funcionário da Apple, então acho que posso confiar que essas informações estão corretas.
Portanto, parece que quando o aplicativo é eliminado do alternador de aplicativos (deslizando para cima), o aplicativo nunca será iniciado, mesmo para buscas programadas em segundo plano.
fonte
Você pode alterar as configurações de inicialização do seu destino em "Gerenciar esquema" para
Wait for <app>.app to be launched manually
, o que permite a depuração configurando um ponto de interrupçãoapplication: didReceiveRemoteNotification: fetchCompletionHandler:
e enviando a notificação por push para acionar a inicialização em segundo plano.Não tenho certeza de que resolverá o problema, mas isso pode ajudá-lo na depuração no momento.
fonte
A resposta é SIM, mas não deve usar 'Busca em segundo plano' ou 'Notificação remota'. PushKit é a resposta que você deseja.
Em resumo, o PushKit, a nova estrutura do ios 8, é o novo mecanismo de notificação por push que pode iniciar silenciosamente seu aplicativo em segundo plano, sem nenhum aviso visual de alerta, mesmo que seu aplicativo tenha sido eliminado ao deslizar para fora do alternador de aplicativos, surpreendentemente você nem consegue vê-lo. do alternador de aplicativos.
Referência PushKit da Apple:
Para implantar esse novo recurso, consulte este tutorial: https://zeropush.com/guide/guide-to-pushkit-and-voip - Eu testei no meu dispositivo e funciona conforme o esperado.
fonte
Na verdade, se você precisar testar a busca em segundo plano, precisará ativar uma opção no esquema:
Outra maneira de testá-lo:
A seguir, informações completas sobre esse novo recurso: http://www.objc.io/issue-5/multitasking.html
fonte
Estou tentando diferentes variantes disso há dias, e durante um dia pensei em reiniciar o aplicativo em segundo plano, mesmo quando o usuário passou para matar, mas não, não posso replicar esse comportamento.
É lamentável que o comportamento seja bem diferente do que antes. No iOS 6, se você matasse o aplicativo a partir dos ícones oscilantes, ele ainda seria reativado nos gatilhos do SLC. Agora, se você matar passando, isso não acontece.
É um comportamento diferente, e o usuário, que continuaria recebendo informações úteis do nosso aplicativo se o matasse no iOS 6, agora não o fará.
Precisamos incentivar nossos usuários a reabrirem o aplicativo agora, se eles passaram o dedo para eliminá-lo e ainda esperam um pouco do comportamento de notificação que costumávamos dar a eles. Estou preocupado que isso não seja óbvio para os usuários quando eles deslizarem um aplicativo. Afinal, eles podem estar basicamente limpando ou querendo reorganizar os aplicativos que são mostrados minimizados.
fonte
Isso pode ajudá-lo
Fonte: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
fonte
O link do vídeo: https://developer.apple.com/videos/play/wwdc2019/707/
fonte