En la presentación "Novedades de la multitarea" de la WWDC 2013, hay una sección sobre notificaciones automáticas silenciosas. Parece sencillo. Según la presentación, si envía la carga útil de APS con solo el contenido disponible establecido en 1, los usuarios no serán notificados de la notificación.
// A. This doesn't work
{
aps: {
content-available: 1
}
}
Mis pruebas muestran que esto no funciona ya que no se recibe ningún empujón. Pero si incluyo el atributo de sonido pero excluyo el atributo de alerta, funciona (aunque ya no es silencioso).
// B. This works
{
aps: {
content-available: 1,
sound: "default"
}
}
Sin embargo, si cambio el atributo de sonido para reproducir un audio silencioso, puedo imitar un empujón silencioso.
// C. This works too.
{
aps: {
content-available: 1,
sound: "silence.wav"
}
}
Alguien sabe:
- Si esto es un error?
- ¿Y si es correcto asumir que B o C están siendo tratados como una notificación remota (y no un error con Silent Push donde necesita un atributo de sonido)? Si es así, esto significa que no tiene una tasa limitada como lo son los Silent Pushes ... que Apple probablemente arreglará. Así que probablemente no debería confiar en eso.
- ¿Cuál es el límite de frecuencia (N pulsaciones cada X segundos, etc.)?
Gracias por adelantado.
Editar con más información
Para A, el estado de la aplicación no importa. Nunca se recibe una notificación.
Parece que B y C solo funcionan si encierra los atributos y valores entre comillas, como se muestra a continuación.
{"aps":{"content-available": 1, "sound":"silent.wav"}}
Y la notificación llega a la aplicación: didReceiveRemoteNotification: fetchCompletionHandler: independientemente del estado.
fuente
Background fetch
casilla de verificación enProject Capabilities
>Background Modes
porque la primera opción debería funcionar. El empuje silencioso no necesita un atributo de sonido y siempre llegaapplication:didReceiveRemoteNotification:fetchCompletionHandler:
incluso si la aplicación se está ejecutando en segundo plano / en primer plano o no se está ejecutando.Respuestas:
Esto también funciona y no reproduce un sonido cuando llega:
{ aps = { "content-available" : 1, sound : "" }; }
EDITAR
Las personas que tienen este problema pueden querer consultar este enlace . He estado participando en un hilo en el foro de desarrolladores de Apple que repasa todos los estados de la aplicación y cuándo se reciben y no se reciben notificaciones silenciosas.
fuente
Así que me encontré con este problema ayer, y después de intentar enviar una carga útil con un sonido configurado en una cuerda vacía, todavía causaba vibración / sonido en el dispositivo. Finalmente, me topé con una publicación de blog de Urban Airship que sugería que tenía que enviar:
{ priority: 5 }
en la notificación de inserción, que nunca había visto. Después de leer los documentos de Apple en busca de notificaciones push, me encontré con esta página:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html
Lo que indica que la prioridad debe establecerse como "5" o "10", y explica:
En última instancia, pudimos obtener notificaciones push silenciosas que funcionaban con un recuento de insignias (y sospecho que incluso podría hacer lo mismo con una alerta) con el siguiente formato:
aps = { badge = 7; "content-available" = 1; priority = 5; };
fuente
Intenté configurar una cadena vacía como atributo de alerta y también funcionó:
{ aps = { "content-available" = 1; "alert" = ""; }; }
Parece que APNS está verificando la existencia de estos atributos con el fin de validar la carga útil de inserción. Curiosamente, no están comprobando el contenido real. Aunque parece un poco hacky ...
fuente
alert=""
la carga útil también funcionó para míiOS 9.0
. En cambiosound=""
, no funcionó.Uso la herramienta: Knuff envía mi notificación automática a mi dispositivo.
Parece que:
Luego, probé estos ejemplos.
¡Todos son trabajo! ¡Pero debes establecer la prioridad 10!
Entonces, si no está utilizando la herramienta, también lo anote.
ejemplos:
fuente
Esto funciona para mi:
{ aps: { content-available: 1 } }
Mire si marca la
Background fetch
casilla de verificación enProject Capabilities
>Background Modes
fuente
Veo el mismo problema. Si envío un push con "content-available": 1 y ningún otro atributo establecido, la notificación nunca se recibe. Cuando agrego cualquier otro atributo, funciona perfectamente.
Como una solución temporal, estoy agregando el atributo de insignia, ya que esto no alerta al usuario de ninguna manera, aparte de agregar la insignia al icono.
Avísame si has encontrado una mejor solución.
fuente
La prioridad debe establecerse como un elemento en la secuencia binaria pero no en la cadena json de carga útil. Aparentemente, solo se puede usar el último formato de tipo 2 para establecer la prioridad de la siguiente manera:
$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 (primer byte) para mensajes binarios de notificación remota:
0 - simple (antiguo) 1 - mejorado (antiguo) 2 - más reciente con más parámetros (nuevo)
fuente
¡Argh! También tirando de mi cabello - esto no es tanto una respuesta como otro ejemplo de una carga útil que NO funciona. El método didReceiveRemoteNotification nunca se llama, aunque si el dispositivo está inactivo, se muestra el texto de alerta.
{"aps": { "alert":"alert!", "sound":"default", "content-available" : 1}, "content-id":21482, "apt":"1" }
"apto" es un campo personalizado que usamos para indicar el tipo de notificación.
fuente
Establecer 'sonido' en 0 funcionó para mí ... :)
fuente
establecer la prioridad en 5 no funcionó para mí, pero configurar el sonido o la alerta para una cadena vacía hizo que la notificación se manejara como una de alta prioridad
fuente
Tuvimos el mismo problema y no se entregó ninguna notificación. En nuestro caso, usamos un push silencioso para actualizar el número de placa. Cuando configuramos cadenas vacías para alerta (cuerpo y título) y sonido, funcionaría, pero si alguna de las claves no estaba presente, fallaba. Esto es lo que funcionó, actualizar la insignia sin sonido ni alerta (registro del diccionario userInfo resultante en didReceiveRemoteNotification)
{ aps = { alert = { body = ""; title = ""; }; badge = 103; "content-available" = 1; sound = ""; }; }
fuente