Pushs silenciosos não entregues no aplicativo no iOS 11


168

Percebi que no iOS 11 beta 2, as notificações silenciosas não são entregues application:didReceiveRemoteNotification:fetchCompletionHandlerindependentemente do estado do aplicativo (plano de fundo / primeiro plano).

Eu implementei o UIApplicationDelegetemétodo application:didReceiveRemoteNotification:fetchCompletionHandlere 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 UserNotificationestrutura 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.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

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 33278611qual 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 DuetActivitySchedulerDaemonque 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

1
ainda não corrigido no Beta 8, quando olho no console, vejo o seguinte erro: <NSXPCConnection: 0x123f43620> conexão do pid 58: exceção detectada durante a decodificação da mensagem recebida, descartando a mensagem recebida. Exceção: exceção ao decodificar o argumento 0 (nº 2 da invocação): Exceção: o valor da chave 'NS.objects' era da classe inesperada 'NSNull'. As classes permitidas são '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'.
21817 Thomas Einwaller

2
Estou obtendo o mesmo resultado com o iOS 11 (não antes), se enviar com o push "content-available": 1e o aplicativo estiver em primeiro plano, o retorno de chamada não será acionado.
GoRoS

4
Depois de testar com o novo iOS11.1 beta 1, parece que isso foi corrigido agora e está funcionando como antes no iOS 10
Lee

3
Whatsapp parecem ter tido um problema semelhante whatsappen.com/news/5465/... Algo sobre usuários que "habitualmente Force Close seus aplicativos", que é a maioria dos desenvolvedores ...
toxaq

3
E exatamente o mesmo com o lançamento público da 11.1. Se você estiver usando toques silenciosos e seu aplicativo estiver em primeiro plano, não espere que eles sejam entregues dependendo de várias coisas, mas principalmente do nível da bateria, mesmo se o dispositivo estiver conectado a uma fonte de alimentação.
Gruntcakes # 31/17

Respostas:


31

Portanto, as notas de versão do iOS 11.1 beta 1 dizem

O iOS 11.1 beta 1 acabou de ser lançado e eles mencionam: "Problemas resolvidos nas notificações • As notificações push silenciosas são processadas com mais frequência. (33278611)

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:fetchCompletionHandlerdelegado é 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.


3
Nos meus testes iniciais, pensei que fosse consertado. Funcionou durante um tempo. Mas, depois de alguns testes pesados, as coisas começaram a desmoronar. De repente, parou de chamar o delegado para cada empurrão silencioso, mesmo com o aplicativo em primeiro plano. Aparentemente, esse novo sistema de "dueto" está impedindo que o delegado do meu aplicativo seja chamado devido à falta de "energyBudget". Então, infelizmente, ainda não foi corrigido.
Abras

inacreditável :(
Thomas Einwaller 28/09

Minha experiência é a mesma de Abras acima. Trabalhou por um tempo, então se desfez eo manipulador não foi chamado - isso é uma merda,
Lee

Após mais testes, consegui encontrar uma maneira de fazer o dispositivo receber notificações novamente. Conecte-o ao poder. Assim que você conectar o dispositivo à energia, ele começará a receber todas as Notificações remotas novamente. Se você desconectá-lo, ele para. Isso não faz sentido, porque em todos os meus testes o aplicativo estava em primeiro plano. E os aplicativos em primeiro plano garantem o recebimento de notificações remotas.
Abras

para mim, está tudo funcionando bem, mesmo em uma conexão de celular sem estar conectado a uma fonte de energia. Somente quando coloco o dispositivo no modo de economia de energia, não recebo os empurrões, mesmo quando em primeiro plano. Mas isso é algo que eu ia entender
Jan

18

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.


2
Obrigado pelo relatório. Btw, ligando o bug a Apple não vai ajudar aqui como eles são privados e apenas o repórter e Apple pode vê-los
Jan

Eu gostaria de ver mais pessoas usam openradar.appspot.com para que pudéssemos manter o controle de outros radares povos
Thomas Einwaller

existem atualizações em seu bug reportwith maçã @Bill
MagicFlow

Não recebi nenhuma atualização no meu radar da Apple, mas instalamos a versão beta do iOS 11.1 e parece que o problema foi corrigido.
Bill Dunay

Sim, também enfrentamos o mesmo problema no iOS 11.2.6. Alguma solução ou atualização?
gopik

14

Parece um novo comportamento do iOS 11. O iOS 11 beta 10 fornece alguns logs descritivos sobre esse problema:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

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:

As notificações silenciosas não servem para manter seu aplicativo em segundo plano, nem para atualizações de alta prioridade. Os APNs tratam as notificações silenciosas como de baixa prioridade e podem limitar a entrega se o número total se tornar excessivo. Os limites reais são dinâmicos e podem mudar com base nas condições, mas tente não enviar mais do que algumas notificações por hora.

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.


1
Sim, os push são entregues no dispositivo, mas não no aplicativo. Foi o que escrevi no meu post original. "As notificações silenciosas não são uma forma de manter seu aplicativo em segundo plano", tudo bem, desde que sejam entregues "às vezes". O grande problema é que a notificação silenciosa nunca é entregue ao aplicativo no iOS 11 quando está em segundo plano. Isso anula completamente todo o objetivo dos push de dados.
Jan

Sim, você já escreveu isso, eu só queria fornecer uma explicação completa sobre essas novas políticas de envio. Citei documentos da Apple para mostrar que eles já alertaram sobre a incerteza na entrega por push. Como escrevi: "Consegui receber um empurrão silencioso ontem à noite" (no aplicativo que eu quis dizer), e o aplicativo estava em segundo plano. Mas durante o dia - meu aplicativo não recebe notificações :( Na minha opinião, a Apple afrouxará essas políticas de envio na versão RC. Por outro lado, elas poderiam restaurar o comportamento de envio original - já usavam para se livrar dos recursos fornecidos apenas em versões beta (por exemplo, 10.3 autodelete de chaveiro).
kam800 8/17

Vejo logs semelhantes quando o envio é recebido e o aplicativo é suspenso. O dasd processo então registra default 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.
Jan

já começou a testar com o iOS 11 GM, ainda vendo comportamento estranho, registra como com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller

1
Além disso - consegui resolver meu aplicativo enviando push não silencioso com alguma notificação de stub e preenchendo a notificação com o conteúdo correto usando a Extensão do Serviço de Notificação.
precisa saber é o seguinte

9

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)


7

O iOS 11.1 Beta 2 também contém

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

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.


1
Testei diferentes cenários: estava funcionando no primeiro e no segundo plano. Infelizmente, não funciona, se o aplicativo foi encerrado pelo usuário. Após o término, o dispositivo não recebe nenhum envio silencioso, desde que o aplicativo não seja ativado ativamente novamente pelo usuário. Você experimentou o mesmo?
AlexWoe89 10/10

agora funciona ... após um 'tempo de inatividade' de aprox. De 5 a 10 minutos, as notificações silenciosas estão funcionando conforme o esperado ... desculpe pela minha anterior. comentário :)
AlexWoe89 10/10

1
os push silenciosos nunca funcionavam quando o usuário encerra o aplicativo - consulte developer.apple.com/documentation/uikit/uiapplicationdelegate/… "No entanto, o sistema não inicia automaticamente o aplicativo se o usuário o tiver forçado a sair".
Thomas Einwaller

1
Estou vendo que o iOS11.1 beta 3 está funcionando como o iOS10 e muito melhor que o iOS11.1 beta 2.
Lee

1
@Olecramoak para mim iOS11.1 beta 4 está funcionando como iOS 10.
AlexWoe89

7

O Apple Developer Relations acabou de adicionar um comentário ao meu radar:

Acreditamos que esse problema foi resolvido no iOS 11.2 beta mais recente.

Teste com a versão beta mais recente do iOS. Se você ainda tiver problemas, atualize seu relatório de erros com quaisquer registros ou informações relevantes que possam nos ajudar a investigar.

https://developer.apple.com/download/

atualmente instalando o iOS 11.2 beta - testará o comportamento de envio silencioso


Então, isso significa que o iOS 11.1 GM não resolverá o problema? :(
Olecramoak

É bom ouvir isso, quando podemos realmente esperar o lançamento oficial do iOS11.1?
AlexWoe89

Mantenha-nos informados, atualmente não é possível instalar meu aplicativo, pois não há Xcode para 11.2 disponível. (e eu removeu o aplicativo da minha dispositivo)
Rool Paap

3

Eu tive um problema semelhante com o meu aplicativo, até o iOS 10 eu estava recebendo notificações por push e application:didReceiveRemoteNotification:fetchCompletionHandlersendo 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.

Certifique-se de ativar esses dois recursos.

Depois de ativar a capacidade de busca em segundo plano, ele está funcionando agora


não, ele não funciona no iOS11 - basta encerrar o aplicativo uma vez e parar de ativá-lo. basta ler as respostas e comentários neste tópico
AlexWoe89

2
Para aplicativos encerrados, qualquer notificação por push (push geral ou sielent) não aciona o método delegado no delegado do aplicativo. esse é o comportamento padrão. Não existe um caso especial para o iOS 11.0.
precisa

3

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 alertBodyem branco nos meus CKNotificationInfo()objetos assim:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

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. :)


Funciona para mim também com o CloudKit. Sem o alertBody, você precisaria conectar o dispositivo para obter as Notificações remotas. Comportamento muito estranho ...
powertoold

2

Portanto, esse é realmente um bug no iOS 11 e agora está corrigido no iOS 11 beta 3. application:didReceiveRemoteNotification:fetchCompletionHandlerAgora, 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


1
Na verdade, não é :( Ainda está acontecendo no iOS 11 beta 3
/

1
A Apple reabriu o relatório de erros também. Avisarei você
Jan

1
Não estou recebendo notificações silenciosas no iOS 11 beta 4. Mais preocupante, se o aplicativo não estiver em primeiro plano, às vezes eles aparecem como notificações regulares. Definitivamente algo!
Ben Dodson

1
Acabei de instalar o iOS 11 beta 5 e parece melhor e as notificações silenciosas são entregues quando o aplicativo está em primeiro plano ou em segundo plano por meio do delegado didReceiveRemoteNotification por um tempo e parou de funcionar novamente, não importa o que eu faça: / Você tem o mesmo comportamento?
Janeiro

1
isso seria legal se você testar, assim como isso está me dando dor de cabeça. Os push silenciosos funcionam ou não funcionam aleatoriamente após reiniciar o dispositivo. Eu atualizei meu post original com um projeto de exemplo para que todos nós usamos o mesmo
Jan

2

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.


1
Isso pareceu funcionar para mim, além de uma solução alternativa para obter o DuetActivitySchedulerDaemon para permitir que a notificação ative o aplicativo, até que a apple corrija o erro.
Joe Benton

Ao enviar um JSON com um título vazio, ainda recebo a mensagem no console "Ignorando a notificação sem alerta, som ou distintivo ..." {"aps": {"alert": {"title": ""}, "content-available": "1"}, "gcm.message_id": "0 ... bb"} Essa estrutura JSON está funcionando para você?
Olecramoak

você não deve enviar o 1 (valor do conteúdo disponível) sem aspas?
elkorb

É assim que o Google Firebase formata o Json ("1") e sempre funcionou. Apenas o iOS 11 com o absurdo dasd está criando um problema. Você poderia postar um exemplo de um Json que está funcionando para você?
Olecramoak

Então, o que observo no iOS 11.1 é que os push silenciosos não são entregues se o dispositivo estiver funcionando com a bateria (sem carregar) e o nível da bateria for menor que 20%, mesmo quando o modo de baixa energia NÃO estiver ativado. Isto é mau. Os impulsos silenciosos no iOS 11 não são confiáveis, quase inúteis.
precisa saber é o seguinte

1

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.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

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.


1

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.isRegisteredForRemoteNotificationsmé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 ).

    • Descobri que havia um erro de análise de notificação por push no console devido ao fato de "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.


1

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 UNUserNotificationCenterDelegateprotocolo e willPresent notificationmé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 isto

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

E 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:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.