Notificação silenciosa por push no iOS 7 não funciona

87

Na apresentação "O que há de novo em multitarefa" do WWDC 2013, há uma seção sobre notificações silenciosas por push. Parece direto. De acordo com a apresentação, se você enviar a carga útil do APS apenas com o conteúdo disponível definido como 1, os usuários não serão notificados sobre a notificação.

// A. This doesn't work
{ 
  aps: { 
          content-available: 1 
       }
}

Meu teste mostra que isso não funciona porque nenhum push é recebido. Mas se eu incluir o atributo de som, mas excluir o atributo de alerta, ele funciona (embora não seja mais silencioso).

// B. This works
{ 
  aps: {
          content-available: 1,
          sound: "default"
       }
}

No entanto, se eu alterar o atributo de som para reproduzir um áudio silencioso, posso imitar um push silencioso.

// C. This works too.
{ 
  aps: {
          content-available: 1,
          sound: "silence.wav"
       }
}

Alguém sabe:

  1. Se isso é um bug?
  2. E se for correto presumir que B ou C está sendo tratado como uma Notificação Remota (e não um bug com Silent Push onde você precisa de um atributo de som)? Se for assim, isso significa que não tem limitação de taxa como os Silent Pushes são ... que a Apple provavelmente consertará. Portanto, provavelmente não devo confiar nisso.
  3. Qual é o limite de taxa (N empurra a cada X segundos, etc)?

Desde já, obrigado.

Edite com mais informações

Para A, o estado do aplicativo não importa. Notificação nunca é recebida.

Parece que B e C só funcionam se você colocar os atributos e valores entre aspas, como abaixo.

{"aps":{"content-available": 1, "sound":"silent.wav"}}

E a notificação chega no aplicativo: didReceiveRemoteNotification: fetchCompletionHandler: independente do estado.

mkwon
fonte
Não funciona em nenhum estado de aplicativo? Para mim, " A " funciona desde que o aplicativo esteja sendo executado em primeiro plano (didReceiveRemoteNotification é chamado). Mas quando o aplicativo não está funcionando, ele não está sendo notificado (eu apenas ouço o som, quando tento " B "). Seu aplicativo é ativado (didReceiveRemoteNotification) em segundo plano quando você usa " B " ou " C "?
DerBernie
Estou vendo um comportamento semelhante, mas acho que pode ser porque estou tentando fazer isso há um tempo e não tinha o aplicativo configurado corretamente no início, então a Apple pode ter me estrangulado antes que eu tivesse a configuração correta.
nickthedude
4
Cara ... Eu gostaria de poder te dar 10 votos
Michael Wiles
Veja se você marcou a Background fetchcaixa de seleção em Project Capabilities> Background Modesporque a primeira opção deve funcionar. O push silencioso não precisa de um atributo de som e sempre chega application:didReceiveRemoteNotification:fetchCompletionHandler:mesmo se o aplicativo estiver em execução em segundo plano / primeiro plano ou não.
IgniteCoders

Respostas:

73

Isso também funciona e não emite nenhum som quando chega:

{
    aps = {
        "content-available" : 1,
        sound : ""
    };
}

EDITAR

Pessoas com este problema podem querer verificar este link . Tenho participado de um tópico no fórum de desenvolvedores da Apple que aborda todos os estados do aplicativo e quando pushes silenciosos são recebidos e não recebidos.

CMVR
fonte
Obrigado pelo link. Existem vários tópicos discutindo isso nos Fóruns da ADC. Resumindo: há um bug - após a reinicialização do dispositivo - que um representante da Apple reconheceu que deve ser corrigido em uma atualização (eventualmente).
SG1
3
No iOS7 funciona muito bem mesmo sem teclas de som / alerta. O conteúdo disponível é a chave suficiente! Mas no iOS8, temos um comportamento realmente estranho quando até mesmo definimos a chave de alerta com string não vazia além de "content-available": 1 obtemos apenas banner com string "alert", mas "content-available" está ignorando por alguns motivos
malex
Tive sucesso ao iniciar o aplicativo a partir da notificação com ou sem o som adicionado. Talvez, definir um som, alerta ou emblema (vazio ou não) aumente a prioridade de notificação padrão para 10, aumentando assim sua confiabilidade. Veja o que a Apple diz sobre pans-priority: developer.apple.com/library/ios/documentation/… A prioridade padrão é 10 (alta), mas é um erro usar isso para notificação push com apenas a chave de conteúdo disponível. Portanto, talvez o padrão seja definido como 5 se apenas a chave de conteúdo disponível for definida.
emem
1
não funciona no iOS10. Devo empurrar algo para "soar".
Stony
Trabalhou no iOS10 para mim. Mas não funciona agora no iOS11
eslavo
30

Eu me deparei com esse problema ontem, e depois de tentar enviar uma carga útil com um som definido para uma corda vazia, ainda estava causando vibração / som no dispositivo. Eventualmente, me deparei com uma postagem de blog da Urban Airship que sugeria a necessidade de enviar:

{ priority: 5 }

na notificação push, que eu nunca tinha visto. Depois de ler os documentos da Apple para notificações push, me deparei com esta página:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html

O que indica que a prioridade deve ser definida como "5" ou "10" e explica:

A prioridade da notificação. Forneça um dos seguintes valores:

10 A mensagem push é enviada imediatamente.

A notificação push deve acionar um alerta, som ou emblema no dispositivo. É um erro usar essa prioridade para um push que contém apenas a chave de conteúdo disponível.

5 A mensagem push é enviada em um momento que economiza energia no dispositivo que a recebe.

Por fim, conseguimos obter notificações push silenciosas trabalhando com uma contagem de crachás (e suspeito que você poderia até fazer o mesmo com um alerta) com o seguinte formato:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
Dave Lyon
fonte
Ótima resposta Dave! Uma prioridade de 5 é permitida, enquanto "é um erro usar esta prioridade [10] para um push que contém apenas a chave de conteúdo disponível." developer.apple.com/library/ios/documentation/…
rjobidon
4
Deve ser incluída prioridade na carga útil? IMO é separado um byte no push que você envia.
Foriger
6
A prioridade não é definida na carga útil. Isso é definido na notificação binária.
Sandy D.
10

Tentei definir uma string vazia como o atributo de alerta e também funcionou:

{
    aps =     {
        "content-available" = 1;
        "alert" = "";
    };
}

Parece que o APNS está verificando a existência desses atributos com o objetivo de validar a carga útil de push. Curiosamente, eles não estão verificando o conteúdo real. Parece um pouco maluco ...

JaimeFBC
fonte
Essa solução com alert=""a carga útil funcionou para mim também iOS 9.0. Em sound=""vez disso, não funcionou.
Loretoparisi
5

Eu uso a ferramenta - Knuff envia minha notificação push para o meu dispositivo.

Parece: insira a descrição da imagem aqui

Então, tentei este exemplo.

Todos eles são trabalho! Mas você deve definir a prioridade 10!

Portanto, se você não estiver usando a ferramenta, também anote.


exemplos:

  • sem alerta, sem som

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

  • apenas alerta

{
    "aps":{
        "content-available":1,
        "alert":""
    }
}

  • só som

{
    "aps":{
        "content-available":1,
        "sound":""
    }
}

wenghengcong
fonte
4

Isso funciona para mim:

{ 
  aps: { 
          content-available: 1 
       }
}

Olhe se você marcar a Background fetchcaixa de seleção em Project Capabilities>Background Modes

IgniteCoders
fonte
2

Estou vendo o mesmo problema. Se eu enviar um push com "conteúdo disponível": 1 e nenhum outro atributo definido, a notificação nunca será recebida. Quando adiciono qualquer outro atributo, ele funciona perfeitamente.

Como uma solução temporária, estou adicionando o atributo do emblema, pois isso não alerta o usuário de nenhuma forma além de adicionar o emblema ao ícone.

Avise-me se você encontrou uma solução melhor.

Jon C
fonte
1

A prioridade deve ser definida como um item no fluxo binário, mas não na string json da carga útil. Aparentemente, apenas o formato tipo 2 mais recente pode ser usado para definir a prioridade da seguinte forma:

$token      = chr(1) . pack('n', 32)     . pack('H*', $deviceToken);
$payload    = chr(2) . pack('n', strlen($json)) . $json;
$identifier = chr(3) . pack('n', 4)      . pack('N', $notification);
$expiration = chr(4) . pack('n', 4)      . pack('N', time()+86400);
$priority   = chr(5) . pack('n', 1)      . chr($priority);

$frame_data = $token.$payload.$identifier.$expiration.$priority;
$frame_length = strlen(bin2hex($frame_data))/2;

$msg = chr(2) . pack('N', $frame_length) . $frame_data;

Tipos de formato (primeiro byte) para mensagem binária de notificação remota:

0 - simples (antigo) 1 - aprimorado (antigo) 2 - mais recente com mais parâmetros (novo)

dev03
fonte
0

Argh! Também puxando meu cabelo - isso não é tanto uma resposta, mas outro exemplo de uma carga útil que NÃO funciona. O método didReceiveRemoteNotification nunca é chamado, embora se o dispositivo estiver hibernando, o texto de alerta será exibido.

 {"aps":
    {  "alert":"alert!",
       "sound":"default",
       "content-available" : 1},
    "content-id":21482,
    "apt":"1"
}

"apt" é um campo personalizado que usamos para indicar o tipo de notificação.

software evoluiu
fonte
2
Se o aplicativo estiver em segundo plano e se você remover o atributo 'alert', deverá receber o retorno de chamada no aplicativo: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon e se eu quiser ver o alerta (push normal) enquanto em BG + invoque o aplicativo: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR
0

Definir 'som' para 0 funcionou para mim ... :)

Alex Zak
fonte
0

definir a prioridade como 5 não funcionou para mim, mas definir som ou alerta para uma string vazia fez com que a notificação fosse tratada como de alta prioridade

Radim
fonte
0

Tivemos o mesmo problema com nenhuma notificação sendo entregue. Em nosso caso, estávamos usando um push silencioso para atualizar o número do crachá. Quando definimos strings vazias para alerta (corpo e título) e som, ele funcionaria, mas se alguma das teclas não estivesse presente, ela falhou. Aqui está o que funcionou, atualizando o crachá sem som ou alerta (log do dicionário userInfo resultante em didReceiveRemoteNotification)

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Grant Luck
fonte