Percebi que no iOS 11 beta 2, as notificações silenciosas não são entregues application:didReceiveRemoteNotification:fetchCompletionHandler
independentemente do estado do aplicativo (plano de fundo / primeiro plano).
Eu implementei o UIApplicationDelegete
método application:didReceiveRemoteNotification:fetchCompletionHandler
e envio o seguinte envio silencioso
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
mas o método delegado não é chamado no iOS 11.
Funciona bem em outras versões do iOS e a seção de documentação Configurando uma notificação silenciosa não menciona que qualquer outra coisa deve ser feita.
Isso é um bug no iOS 11 ou perdi algo novo no iOS 11?
Observe que não estou falando ou usando a UserNotification
estrutura que não deve ser necessária para o envio de notificações silenciosas.
Aqui está um projeto de exemplo que ilustra o problema (você precisará definir seu próprio ID de pacote configurável)
Quando você almoça o projeto de amostra e envia uma carga útil acima para o aplicativo, pode usar o console do macOS para verificar se o push é entregue corretamente ao dispositivo, mas não ao aplicativo.
ATUALIZAÇÃO 10.08
Parece que o comportamento é aleatório. Às vezes, após reiniciar o dispositivo, a carga útil é entregue corretamente, mas para de funcionar após algum tempo.
Como você pode ver na captura de tela a seguir, o envio marcado como 1 é entregue apenas ao dispositivo e o envio 2 (após a reinicialização do dispositivo) também é entregue ao aplicativo.
ATUALIZAÇÃO 14.08 - iOS 11 Beta 6
Ainda é o mesmo comportamento. Outra coisa que deve funcionar, mas não funciona, é o seguinte. Quando o esquema do aplicativo é definido como "Aguardar o lançamento do executável", um push silencioso deve ativar o aplicativo e iniciá-lo em segundo plano.
ATUALIZAÇÃO 21.08 - iOS 11 Beta 7
Ainda tem o mesmo comportamento e não as atualizações da Apple no relatório de bug.
ATUALIZAÇÃO 29.08 - iOS 11 Beta 8
Ainda é o mesmo problema. As etapas para reproduzir agora são as seguintes:
- No esquema do projeto Xcode, selecione "Aguardar o lançamento do executável"
- Adicione um ponto de interrupção no
didReceiveRemoteNotification: fetchCompletionHandler
- Inicie o aplicativo no dispositivo
- Envie o push silencioso acima
Esperado : o aplicativo é trazido do estado suspenso para o segundo plano e didReceiveRemoteNotification: fetchCompletionHandler
é chamado
Real : nada acontece
ATUALIZAÇÃO 06.09 - iOS 11 Beta 10
Eu ainda estou tendo o mesmo comportamento de buggy. O ticket da Apple foi atualizado com a seguinte resposta:
Relações com desenvolvedores da Apple 6 de setembro de 2017 às 22:42 A Engineering forneceu os seguintes comentários sobre esse problema:
Conseguimos executar o aplicativo de amostra e testar o comportamento. Não vimos nenhum problema quando testamos isso como descrito.
Não é garantido que os pushs cheguem ao aplicativo quando ele estiver em execução em segundo plano, e os logs aqui indicam que não acreditamos que o aplicativo esteja sendo usado o suficiente para iniciá-lo.
Nós nos vemos entregando empurrões de tempos em tempos, quando as condições são boas.
Acreditamos que isso está se comportando corretamente.
Atualização 11.09
Meu relatório de bug da Apple foi fechado e marcado como duplicado, o 33278611
qual permanece aberto
ATUALIZAÇÃO 13.09 - iOS 11 GM
Graças aos comentários de kam800 (veja abaixo), fiz mais testes e fiz essas observações:
Parece haver um novo daemon no iOS 11 dasd DuetActivitySchedulerDaemon
que descarta completamente o envio de dados ou atrasa a entrega de envio de dados:
Entrega adiada
Logs do console
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Problemas de entrega adiada
- Quando a entrega de envio de dados é adiada e o aplicativo é iniciado, o envio de dados é entregue somente quando a data de entrega é alcançada, o que pode levar vários minutos no futuro. Isso anula completamente o objetivo de usar os push de dados para manter o conteúdo do novo aplicativo pronto para o próximo lançamento. Cito aqui mais uma vez a documentação da Apple:
"As notificações silenciosas melhoram a experiência do usuário, ajudando você a manter seu aplicativo atualizado, mesmo quando não está em execução".
- Quando dois pushs de dados são enviados para um aplicativo suspenso, eles são adiados pelo iOS 11 em vez de ativar o aplicativo diretamente. Quando o tempo de entrega é atingido, apenas o último envio de dados é entregue! Os pushes anteriores são perdidos e não são entregues pelo método delegado, resultando em uma perda de dados.
Entrega cancelada
Logs do console
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Problemas de entrega cancelados
Bem, nesse caso, o envio de dados é completamente perdido e nunca é entregue no iOS 11 enquanto foi entregue corretamente no iOS 10.
ATUALIZAÇÃO 19.09 - iOS 11 GM
Também notei que, quando o aplicativo está em primeiro plano e a notificação não é entregue ao aplicativo, vejo os seguintes logs no console:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
e o aplicativo estiver em primeiro plano, o retorno de chamada não será acionado.Respostas:
Portanto, as notas de versão do iOS 11.1 beta 1 dizem
Eu fiz alguns testes e parece estar realmente consertado:
Estado suspenso
Quando inicio o aplicativo no modo suspenso e envio um envio silencioso, o aplicativo é trazido de volta ao plano de fundo e o
didReceiveRemoteNotification:fetchCompletionHandler
delegado é chamado.Estado do primeiro plano
Da mesma forma, quando o aplicativo está em primeiro plano e um envio silencioso é enviado, o delegado parece ser chamado conforme o esperado. Este foi aleatoriamente não trabalhando em iOS anteriores 11 versões isso vou confirmar isso depois de mais testes.
fonte
Só queria adicionar meus 2 centavos aqui, pois também fui atingido por esse problema e notei que a Apple fechou vários radares sobre esse problema, dizendo que eles não podiam se reproduzir. Uma coisa interessante que descobri é que os pushs serão entregues se o aplicativo estiver em segundo plano enquanto estiver conectado ao depurador.
Se eu matar o depurador, desconectar o telefone, iniciar o aplicativo e enviar a carga silenciosa, vejo que o aplicativo NÃO está sendo ativado. Vejo no log do console que o sistema cancela a entrega da carga útil ao meu aplicativo.
Enviei um radar com um pequeno aplicativo de amostra que reproduz o problema. Também observei explicitamente no radar que a pessoa que trabalha no meu ticket não deve estar executando o aplicativo anexado ao depurador para reproduzir o problema. Aqui está o link: https://bugreport.apple.com/web/?problemID=34461063
Esperemos que isso faça com que algum progresso seja feito sobre esse problema.
fonte
Parece um novo comportamento do iOS 11. O iOS 11 beta 10 fornece alguns logs descritivos sobre esse problema:
Parece que todo push silencioso é entregue ao iOS, mas o dad dad usa algumas políticas para decidir se o push silencioso deve ser entregue ao aplicativo (por exemplo, nível da bateria). Consegui receber um empurrão silencioso ontem à noite, mas meu iPhone estava conectado ao carregador naquele momento - provavelmente a pontuação BatteryLevelPolicy era alta o suficiente para receber aquele empurrão silencioso.
A Apple não fornece informações oficiais sobre esse comportamento no iOS, há apenas informações sobre a otimização no servidor:
Eu mantenho meus dedos cruzados, eles mudaram esse comportamento, porque isso consertaria meu aplicativo :) Por outro lado, essa mudança é boa - uma entre muitas coisas que fazem a bateria do iPhone durar mais do que os telefones Android.
fonte
dasd
processo então registradefault 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017
. O empurrão silencioso parece ter sido entregue naquele momento.com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
As notas da versão beta do iOS 11.1 incluem: Notificações Problemas resolvidos As notificações push silenciosas são processadas com mais frequência. (33278611)
fonte
O iOS 11.1 Beta 2 também contém
nas Notas da versão - o testará agora.
ATUALIZAÇÃO - 11.11.2017 - iOS 11.1 Beta 2
Depois de usar nosso aplicativo por 2 dias em "cenários do mundo real", parece que há uma melhoria real nesta versão do iOS. Estou cautelosamente começando a acreditar que isso está resolvido.
fonte
O Apple Developer Relations acabou de adicionar um comentário ao meu radar:
atualmente instalando o iOS 11.2 beta - testará o comportamento de envio silencioso
fonte
Eu tive um problema semelhante com o meu aplicativo, até o iOS 10 eu estava recebendo notificações por push e
application:didReceiveRemoteNotification:fetchCompletionHandler
sendo chamado corretamente, mas quando atualizado para as notificações por push do iOS 11 paramos de funcionar.O problema com meu código foi que, embora eu estivesse usando o conteúdo disponível: 1 e o conteúdo mutável: 1 na carga útil da notificação por push, a opção Busca em segundo plano não estava ativada. Mas estava funcionando perfeitamente até o iOS 10.
Depois de ativar a capacidade de busca em segundo plano, ele está funcionando agora
fonte
iOS 11.4.1, Swift 4
Eu estava tendo problemas com os impulsos silenciosos que não chegavam (do CloudKit) e tentei tudo o que todos mencionaram aqui. Então eu decidi tentar colocar um espaço
alertBody
em branco nos meusCKNotificationInfo()
objetos assim:Isso fez com que os pushs fossem enviados com prioridade mais alta (mas ainda eram silenciosos) e eu não recebi mais o erro nos logs do dispositivo de que o push estava sendo ignorado.
Espero que ajude alguém. :)
fonte
Portanto, esse é realmente um bug no iOS 11 e agora está corrigido no iOS 11 beta 3.
application:didReceiveRemoteNotification:fetchCompletionHandler
Agora, ele é chamado corretamente quando um push silencioso é recebido em primeiro plano ou em segundo plano.ATUALIZAR
Não, não está corrigido e ainda está acontecendo no iOS beta 3 e 4
fonte
Como solução alternativa, estamos adicionando uma chave de "notificação" e dentro de um "título" com uma string vazia como valor. Isso ativa o retorno de chamada didReceive no appDelegate.
fonte
Ao escrever esta resposta, estou enfrentando exatamente o mesmo problema que a resposta de Bill Dunay .
Meu requisito era receber notificações silenciosas quando o aplicativo estiver em primeiro plano e nada quando o aplicativo estiver em segundo plano / não estiver em execução. E minha solução alternativa foi essa. Não uso distintivos, portanto, defini-lo como zero não é um problema para mim.
Observe que, deliberadamente, não estou usando "conteúdo disponível". Configuração que faz com que a lógica de otimização do iOS atrase / cancele a entrega da notificação.
fonte
Estou recebendo o mesmo problema em algumas notificações (não necessariamente silenciosas).
Depois de revisar todas as atualizações e respostas, posso adicionar duas atualizações que podem ajudar:
Descobri que o
UIApplication.shared.isRegisteredForRemoteNotifications
método de acesso ao receber uma notificação faz com que o aplicativo pare sem relatar nada ao Xcode. Verifique se você está executando algum código depois de receber a notificação que acessa o método. ( isRegisteredForRemoteNotifications bloqueando a interface do usuário com semaphore_wait_trap )."title-loc-args" : [3333]
não aceitar 3333 literalmente, mas aceitá-lo como uma sequência"title-loc-args" : ["3333"]
. Isso fez com que toda a minha interface parasse depois de acessar o método acima, apenas no iOS 11, ele funciona no iOS 12.Também descobri que, com exatamente o mesmo código, ele funciona sem problemas no iOS 12.0 (16A5366a) . Mas no iOS 11 está acontecendo.
fonte
No meu caso, as notificações silenciosas foram usadas para atualizar a interface do usuário após a conclusão do trabalho no site do servidor, por isso foi difícil ter conteúdo não relevante no aplicativo. Como nossa carga útil para notificação silenciosa contém título e corpo uniformes, implemento esses métodos para obter notificações de trabalho no aplicativo ativo / inativo, sem cobrança e com a Atualização de aplicativo em segundo plano desativada e mesmo no estado de baixa energia.
Para que isso funcione, adiciono delegado e crio uma extensão com
UNUserNotificationCenterDelegate
protocolo ewillPresent notification
método (iOS 10 ou posterior), que é acionado sempre com a carga útil correta. Para não mostrar notificação quando o aplicativo estiver ativo, basta concluir a chamada com crachá ou som. Acabei com algo parecido com istoE para trabalhar nesses estados quando o aplicativo está em segundo plano e a notificação silenciosa não chama meus métodos, recebo notificações da central de notificações diretamente
applicationDidBecomeActive
:fonte
No meu caso, "Atualização de aplicativo em segundo plano" foi desativado nas configurações do iPhone. Por esse motivo, a notificação por push foi entregue ao dispositivo, mas não no aplicativo. A ativação da atualização do aplicativo em segundo plano recebe o envio silencioso no aplicativo.
Talvez essa não seja a resposta real para essa pergunta, caso alguém precise verificar.
fonte