As notificações push silenciosas são entregues apenas se o dispositivo estiver carregando e/ou o aplicativo estiver em primeiro plano



iphone background (6)

Eu implementei notificações push silenciosas, mas notei algum comportamento estranho. As notificações push silenciosas são tratadas via:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler

As mensagens de envio silenciosas parecem ser recebidas apenas se o dispositivo estiver carregando (por exemplo, cabo conectado) e / ou se meu aplicativo estiver em primeiro plano.

Se eu desconectar o dispositivo do carregador (ou Mac), as notificações push silenciosas não serão mais recebidas , a menos que o aplicativo esteja em primeiro plano.

Recebo notificações push silenciosas normalmente nos dois casos.

Se eu conectar o cabo USB novamente, recebo o comportamento esperado e as notificações push silenciosas são recebidas, independentemente de o aplicativo ser o primeiro ou o segundo plano.

Estou usando UILocalNotification para saber o que está sendo recebido.

O fato de tudo funcionar bem com o dispositivo conectado sugere que minhas notificações por push silencioso estejam configuradas corretamente e que o aplicativo tenha os modos de segundo plano corretos definidos na lista, etc.

Esse comportamento é repetitivo no iPhone 5s, 6 e iPad 2, todos executando o IOS 8 ou 8.1.

Alguém mais experimentou isso? Deve ser fácil de reproduzir. Por que o simples ato de conectar um dispositivo a um carregador altera a capacidade de receber notificações push silenciosas?

https://ffff65535.com


Se o seu aplicativo não for VoIP, você não poderá seguir essa resposta [seu aplicativo será rejeitado]

Encontrei outra solução que funcionou para mim usando o PushKit Framework

Os push de VoIP fornecem funcionalidade adicional além do envio padrão necessário aos aplicativos de VoIP para executar o processamento sob demanda do envio antes de exibir uma notificação ao usuário

Quando envio VOIP Push, o aplicativo acorda qualquer que seja o estado do aplicativo e pode executar qualquer operação

Registre-se para VOIP PushNotification em didFinishLaunchingWithOptions

 PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];


- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
if([credentials.token length] == 0) {
    NSLog(@"voip token NULL");
    return;
}

NSString *originalToken=[NSString stringWithFormat:@"%@",credentials.token];
NSString *token = [originalToken stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"PushCredentials: %@",token);}

então você pode manipular qualquer busca em segundo plano nessa função depois de receber o VOIP PushNotification

-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type

NOTA: você deve usar um certificado que habilite o certificado de serviços de VoIP


Com o iOS8, a entrega por push para aplicativos mudou. Agora, um push em segundo plano será entregue ao aplicativo apenas em determinadas circunstâncias. A Apple não declarou explicitamente quais são exatamente essas circunstâncias, mas, a partir de minhas extensas experiências, basicamente se resume ao fato de o telefone estar sendo carregado ou não. Existem outras variáveis ​​em jogo (como tipo de rede, tipo de dispositivo, Wi-Fi ativado), mas o principal fator principal é se o dispositivo está sendo carregado ou não quando o push chega.

Se o telefone estiver sendo carregado através de uma fonte de alimentação direta ou indiretamente ao ser conectado por USB a um computador, os empurrões em segundo plano serão entregues ao aplicativo na grande maioria das vezes. Mas desconecte o telefone da fonte de alimentação ou do USB e o empurrão em segundo plano quase nunca será entregue ao aplicativo, mesmo se a bateria do telefone tiver uma carga de 100%.

Você pode testar isso facilmente, enviando alguns toques enquanto o telefone está sendo carregado ou enquanto não está. MAS você deve levar em conta que os impulsos em segundo plano com uma compilação de desenvolvimento e usando o ambiente sandbox NÃO se comportam da mesma forma que os impulsos em segundo plano com uma compilação de produção e um ambiente de produção; os impulsos em segundo plano têm maior probabilidade de serem entregues ao aplicativo em desenvolvimento então eles estão em produção, por isso é vital que você teste usando uma construção de produção e o ambiente de produção da Apple para ver os resultados reais.

Observe que há duas etapas na entrega por push, a primeira é que ela precisa ser entregue no próprio telefone, a segunda é quando o telefone o possui, e depois precisa ser entregue pelo sistema operacional ao aplicativo. No iOS7, coisas como mudar o Wifi aumentaram as chances de o impulso chegar ao telefone. No entanto, com o iOS8, mesmo que o envio seja enviado com sucesso ao telefone, o sistema operacional não o encaminhará para um aplicativo em segundo plano se o telefone não estiver sendo carregado. Isso significa que o telefone recebe a notificação e a mantém, algumas vezes por várias horas, antes de encaminhá-la para o aplicativo se o telefone não estiver sendo carregado.


Estou enfrentando esse problema há algum tempo e sou muito grato por esta pergunta e @Kevin D. compartilhando sua compreensão. Estou começando a pensar que https://.com/a/30834566/1449799 e https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW4 (veja a priority em uma das tabelas) está descrevendo por que meu aplicativo está tendo problemas:

É um erro usar essa prioridade para um envio que contenha apenas a chave de content-available .

Para enviar as notificações, estou usando o node-apn onde o padrão (que também preciso) é definir a prioridade como max ( 10 [cuidado, parece que apenas 10 e 5 são valores corretos no momento]), mas como eu queria uma notificação silenciosa , não tenho alert , badge ou conjunto de sound .


Eu tive o mesmo problema e o motivo por não receber notificações por push enquanto o aplicativo não está carregando é que, quando o Modo de baixa energia é ativado em Settings > Battery , desativa o recurso de background-fetch para todos os aplicativos.

O que impede que o dispositivo receba notificação por push.

Esse link pode ser útil. Documentação da Apple


Não está funcionando porque você ativou o modo de plano de fundo errado na lista. Você precisa habilitar a tag de remote-notification (o aplicativo baixa o conteúdo em resposta a notificações por push), e não a busca. A busca é usada para outra coisa. Você também pode precisar usar a chave de conteúdo disponível na sua carga JSON, por exemplo,

{
   "aps": {
      "content-available": 1
    },
    "yourdatakey":{data}
}

Também notei o mesmo e perdi algum tempo tentando descobrir. Consulte https://.com/a/31237889/1724763

Se você desativou o Bg App Refresh, o envio remoto silencioso será eliminado silenciosamente (a ironia).

No entanto, minha observação é que, se você se conectar ao Xcode via cabo, de alguma forma a configuração Atualização de Aplicativo Bg será ignorada e todo o envio silencioso do aplicativo funcionará.

Suspeito que esse seja um recurso não documentado: o carregamento faz com que a configuração de Atualização do aplicativo BG seja ignorada.





silent-notification