La notificación de inserción silenciosa en iOS 7 no funciona

87

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:

  1. Si esto es un error?
  2. ¿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.
  3. ¿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.

mkwon
fuente
¿No funciona en ningún estado de la aplicación? Para mí, " A " funciona siempre que la aplicación se esté ejecutando en primer plano (se llama a didReceiveRemoteNotification). Pero cuando la aplicación no se está ejecutando, la aplicación no recibe una notificación (solo escucho el sonido cuando intento " B "). ¿Su aplicación se activa (didReceiveRemoteNotification) en segundo plano cuando usa " B " o " C "?
DerBernie
Estoy viendo un comportamiento similar, creo que podría deberse a que he estado probando esto durante un tiempo y no tenía la aplicación configurada correctamente al principio, por lo que Apple puede haberme estrangulado antes de que tuviera la configuración correcta.
nickthedude
4
Amigo ... Ojalá pudiera darte 10 votos
Michael Wiles
Mire si marca la Background fetchcasilla de verificación en Project Capabilities> Background Modesporque la primera opción debería funcionar. El empuje silencioso no necesita un atributo de sonido y siempre llega application:didReceiveRemoteNotification:fetchCompletionHandler:incluso si la aplicación se está ejecutando en segundo plano / en primer plano o no se está ejecutando.
IgniteCoders

Respuestas:

73

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.

CMVR
fuente
Gracias por el enlace. Hay varios hilos que discuten esto en los foros de ADC. En pocas palabras: hay un error, después del reinicio del dispositivo, que un representante de Apple ha reconocido que debería corregirse en una actualización (eventualmente).
SG1
3
En iOS7 funciona muy bien incluso sin teclas de sonido / alerta. ¡El contenido disponible es clave suficiente! Pero en iOS8 tenemos un comportamiento realmente extraño cuando incluso configuramos una clave de alerta con una cadena no vacía además de "contenido disponible": 1 obtenemos solo un banner con una cadena de "alerta", pero "contenido disponible" se ignora por algunas razones
malex
Tuve éxito al iniciar la aplicación desde la notificación con o sin el sonido agregado. Tal vez, configurar un sonido, alerta o placa (vacía o no) aumenta la prioridad de notificación predeterminada a 10, aumentando así su confiabilidad. Vea lo que dice Apple sobre pans-priority: developer.apple.com/library/ios/documentation/… La prioridad predeterminada es 10 (alta), pero es un error usar esto para notificaciones push con solo la clave de contenido disponible. Entonces, tal vez el valor predeterminado sea 5 si solo se establece la clave de contenido disponible.
emem
1
no funciona en iOS10. Debo empujar algo para que "suene".
Stony
Trabajó en iOS10 para mí. Pero no funciona ahora en iOS11
Slav
30

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:

La prioridad de la notificación. Proporcione uno de los siguientes valores:

10 El mensaje push se envía inmediatamente.

La notificación push debe activar una alerta, un sonido o una insignia en el dispositivo. Es un error utilizar esta prioridad para un envío que solo contiene la clave de contenido disponible.

5 El mensaje de inserción se envía en un momento que ahorra energía en el dispositivo que lo recibe.

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;
    };
Dave Lyon
fuente
¡Gran respuesta, Dave! Se permite una prioridad de 5 mientras que "es un error usar esta prioridad [10] para un envío que contiene solo la clave de contenido disponible". developer.apple.com/library/ios/documentation/…
rjobidon
4
¿Debería incluirse la prioridad en la carga útil? En mi opinión, es un byte separado en el empuje que envía.
Foriger
6
La prioridad no se establece en la carga útil. Esto se establece en la notificación binaria.
Sandy D.
10

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

JaimeFBC
fuente
Esta solución con alert=""la carga útil también funcionó para mí iOS 9.0. En cambio sound="", no funcionó.
loretoparisi
5

Uso la herramienta: Knuff envía mi notificación automática a mi dispositivo.

Parece que: ingrese la descripción de la imagen aquí

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:

  • sin alerta, sin sonido

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

  • solo alerta

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

  • solo sonido

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

wenghengcong
fuente
4

Esto funciona para mi:

{ 
  aps: { 
          content-available: 1 
       }
}

Mire si marca la Background fetchcasilla de verificación en Project Capabilities>Background Modes

IgniteCoders
fuente
2

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.

Jon C
fuente
1

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)

dev03
fuente
0

¡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.

software evolucionado
fuente
2
Si la aplicación está en segundo plano y elimina el atributo 'alerta', debería recibir la devolución de llamada en la aplicación: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon y si quiero ver la alerta (push regular) mientras estoy en la aplicación BG + invoke: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR
0

Establecer 'sonido' en 0 funcionó para mí ... :)

Alex Zak
fuente
0

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

Radim
fuente
0

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 = "";
    };
}
Conceder suerte
fuente