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:
- Se isso é um bug?
- 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.
- 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.
fonte
Background fetch
caixa de seleção emProject Capabilities
>Background Modes
porque a primeira opção deve funcionar. O push silencioso não precisa de um atributo de som e sempre chegaapplication:didReceiveRemoteNotification:fetchCompletionHandler:
mesmo se o aplicativo estiver em execução em segundo plano / primeiro plano ou não.Respostas:
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.
fonte
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:
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; };
fonte
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 ...
fonte
alert=""
a carga útil funcionou para mim tambémiOS 9.0
. Emsound=""
vez disso, não funcionou.Eu uso a ferramenta - Knuff envia minha notificação push para o meu dispositivo.
Parece:
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:
fonte
Isso funciona para mim:
{ aps: { content-available: 1 } }
Olhe se você marcar a
Background fetch
caixa de seleção emProject Capabilities
>Background Modes
fonte
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.
fonte
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)
fonte
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.
fonte
Definir 'som' para 0 funcionou para mim ... :)
fonte
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
fonte
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 = ""; }; }
fonte