web-dev-qa-db-fra.com

La notification push silencieuse sous iOS 7 ne fonctionne pas

Dans la présentation "Quoi de neuf avec le multitâche" de la WWDC 2013, vous trouverez une section sur les notifications push silencieuses. Cela semble simple. Selon la présentation, si vous envoyez la charge APS avec uniquement le contenu disponible défini à 1, les utilisateurs ne seront pas avertis de la notification.

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

Mes tests montrent que cela ne fonctionne pas car aucun Push n'est reçu. Mais si j'inclus l'attribut sound mais exclue l'attribut alert, cela fonctionne (même s'il n'est plus silencieux).

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

Cependant, si je modifie l'attribut sound pour lire un son silencieux, je peux imiter une Push silencieuse.

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

Est-ce que quelqu'un sait:

  1. Si c'est un bug?
  2. Et s’il est correct de supposer que B ou C est traité comme une notification à distance (et non comme un bogue avec Silent Push où vous avez besoin d’un attribut son)? Si c'est le cas, cela signifie que le taux n'est pas limité, comme le sont les Push Silent, ce que Apple va probablement réparer. Donc, je ne devrais probablement pas compter dessus.
  3. Quelle est la limite de débit (N appuie toutes les X secondes, etc.)?

Merci d'avance.

Modifier avec plus d'informations

Pour A, l’état de l’application importe peu. La notification n'est jamais reçue.

Il semble que B et C ne fonctionnent que si vous mettez les attributs et les valeurs entre guillemets, comme ci-dessous.

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

Et la notification arrive dans application: didReceiveRemoteNotification: fetchCompletionHandler: indépendamment de l'état.

85
mkwon

Cela fonctionne aussi et ne joue pas de son quand il arrive:

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

MODIFIER

Les personnes ayant ce problème peuvent vouloir vérifier ce lien . J'ai participé à une discussion sur le forum des développeurs d'Apple qui passe en revue tous les états des applications et lorsque les envois silencieux sont reçus et non reçus.

69
CMVR

Je suis donc tombé sur ce problème hier et après avoir essayé d'envoyer une charge utile avec un son défini sur une chaîne vide, cela provoquait toujours des vibrations/du son sur l'appareil. Finalement, je suis tombé sur un article de blog d'Urban Airship qui suggérait d'avoir besoin d'envoyer:

{ priority: 5 }

dans la notification Push, que je n'avais jamais vue. Après avoir parcouru la documentation d'Apple pour les notifications Push, je suis tombé sur cette page:

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

Ce qui indique que la priorité doit être définie sur "5" ou "10", et explique:

La priorité de la notification. Indiquez l'une des valeurs suivantes:

10 Le message Push est envoyé immédiatement.

La notification Push doit déclencher une alerte, un son ou un badge sur le périphérique. Utiliser cette priorité pour un Push contenant uniquement la clé content-available est une erreur.

5 Le message Push est envoyé à un moment qui conserve l'énergie sur le périphérique qui le reçoit.

En fin de compte, nous avons pu obtenir des notifications Push silencieuses fonctionnant avec un nombre de badges (et je suppose que vous pourriez même faire de même avec une alerte) avec le format suivant:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
29
Dave Lyon

J'ai essayé de définir une chaîne vide comme attribut d'alerte et cela a également fonctionné: 

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

Il semble qu'APNS vérifie l'existence de ces attributs dans le but de valider la charge utile Push. Fait intéressant, ils ne vérifient pas le contenu réel. Cela semble un peu hacky cependant ...

10
JaimeFBC

J'utilise l'outil - Knuff envoie ma notification Push à mon appareil.

Ça ressemble à:  enter image description here

Ensuite, j'ai essayé ces exemples.

Ils sont tous du travail! Mais vous devez définir la priorité 10!

Donc si vous n'utilisez pas l'outil, vous le notez également.


exemples:

  • pas d'alerte, pas de son

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

  • seulement alerte

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

  • seulement le son

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

5
wenghengcong

Cela fonctionne pour moi:

{ 
  aps: { 
          content-available: 1 
       }
}

Regardez si vous cochez la case Background fetch dans Project Capabilities> Background Modes

4
IgniteCoders

Je vois le même problème. Si j'envoie un Push avec "content-available": 1 et qu'aucun autre attribut n'est défini, la notification n'est jamais reçue. Lorsque j'ajoute d'autres attributs, cela fonctionne parfaitement.

En tant que solution temporaire, j'ajoute l'attribut badge, car cela n'alerte en rien l'utilisateur, mis à part l'ajout du badge à l'icône.

Faites-moi savoir si vous avez trouvé une meilleure solution.

2
Jon C

La priorité doit être définie comme un élément dans le flux binaire mais pas dans la chaîne json de charge utile. Apparemment, seul le dernier format de type 2 peut être utilisé pour définir la priorité comme suit:

$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;

Types de format (premier octet) pour le message binaire de notification à distance:

0 - simple (ancien) 1 - amélioré (ancien) 2 - dernier avec plus de paramètres (nouveau)

1
dev03

La définition du "son" sur 0 a fonctionné pour moi ... :)

0
Alex Zak

Nous avons eu le même problème sans notification. Dans notre cas, nous utilisions une Push silencieuse pour mettre à jour le numéro de badge. Lorsque nous définissons des chaînes vides pour alert (corps et titre) et pour son, cela fonctionnerait, mais si l'une des clés n'était pas présente, cela échouait. Voici ce qui a fonctionné: mettre à jour le badge sans son ni alerte (journal du dictionnaire userInfo obtenu dans didReceiveRemoteNotification)

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

Argh! Je tire aussi mes cheveux - ce n’est pas tant une réponse, c’est un autre exemple de charge utile qui NE FONCTIONNE PAS. La méthode didReceiveRemoteNotification n'est jamais appelée. Toutefois, si le périphérique est en veille, le texte de l'alerte IS s'affiche.

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

"apt" est un champ personnalisé que nous utilisons pour indiquer le type de notification. 

0
software evolved

définir la priorité sur 5 ne fonctionnait pas pour moi, mais définir un son ou une alerte sur une chaîne vide entraînait le traitement de la notification avec une priorité élevée

0
Radim