A notificação do Voip Pushkit não reinicia o aplicativo se for encerrada à força e o dispositivo tiver sido reiniciado
Não consigo receber notificações de voip pushkit para reiniciar o aplicativo se o usuário forçou o encerramento forçado (deslizando-o na interface multitarefa) E se o dispositivo foi reiniciado.
No entanto, eu posso fazer com que as notificações de voip pushkit funcionem nos seguintes cenários:
O aplicativo foi encerrado com força e a notificação do pushkit chega. O aplicativo será reiniciado imediatamente. As notificações por push padrão não são capazes de ativar o aplicativo nesse cenário.
O aplicativo estava em segundo plano / suspenso e o dispositivo foi reiniciado. Graças ao modo Voip, o aplicativo será reiniciado na reinicialização do dispositivo (posso ver o processo no Xcode Activity Monitor). O, re é um truque necessário aqui para que a notificação do pushkit seja processada corretamente, descrita emhttp://blog.biokoda.com/post/114315188985/ios-and-pushkit nestes termos "Antes de inicializar o PushKit, inicie uma tarefa em segundo plano. Conclua esta tarefa quando o token PushKit for recebido"
De alguma forma, ao combinar esses dois (reinicialização do dispositivo e encerramento forçado do aplicativo), as notificações por pushkit não parecem reiniciar o aplicativo. Além disso, ao olhar para os logs do dispositivo no Xcode, não recebo logs do apsd dizendo que a notificação foi processada pelo sistema.
Aqui está o meu código:
@implementation AppDelegate
{
UIBackgroundTaskIdentifier bgTask;
}
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIApplication* app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(
DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while (true) {
;
}
});
// Initialize pushkit
PKPushRegistry *pushRegistry =
[[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
return YES;
}
- (void)pushRegistry:(PKPushRegistry *)registry
didUpdatePushCredentials:(PKPushCredentials *)credentials
forType:(NSString *)type{
UIApplication* app = [UIApplication sharedApplication];
[app endBackgroundTask:bgTask];
// ... more code to read the token ...
}
- (void)pushRegistry:(PKPushRegistry *)registry
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
forType:(NSString *)type {
// ... logging to check if notification is received ...
}
Também tenho "Voz sobre IP" e "Notificações remotas" ativadas nos modos de segundo plano.
Sei que outros aplicativos como o WhatsApp podem ser reiniciados neste cenário, por isso não entendo o que estou fazendo de errado.
Em uma nota relacionada, não ajuda: 1) Forçar o encerramento 2) Enviar uma notificação de pushkit - que será recebida 3) Reinicializar. O aplicativo não será reiniciado e uma nova notificação por push ainda não o reiniciará.