La notification push silencieuse dans iOS 7 ne fonctionne pas

87

Dans la présentation «Quoi de neuf avec le multitâche» de la WWDC 2013, il y a une section sur les notifications push silencieuses. Cela semble simple. Selon la présentation, si vous envoyez la charge utile APS avec uniquement le contenu disponible défini sur 1, les utilisateurs ne seront pas informés 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 exclut l'attribut alert, cela fonctionne (bien que plus silencieux).

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

Cependant, si je change l'attribut sonore pour lire un son silencieux, je peux imiter une poussée 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 sonore)? Si tel est le cas, cela signifie qu'il n'est pas limité comme le sont les Silent Pushes ... ce qu'Apple corrigera probablement. Je ne devrais donc probablement pas m'y fier.
  3. Quelle est la limite de débit (N pousse toutes les X secondes, etc.)?

Merci d'avance.

Modifier avec plus d'informations

Pour A, l'état de l'application n'a pas d'importance. 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 l' application: didReceiveRemoteNotification: fetchCompletionHandler: quel que soit l'état.

mkwon
la source
Cela ne fonctionne-t-il dans aucun état d'application? Pour moi, " A " fonctionne tant que l'application s'exécute au premier plan (didReceiveRemoteNotification est appelée). Mais lorsque l'application n'est pas en cours d'exécution, l'application ne reçoit pas de notification (j'entends juste le son, quand j'essaye " B "). Votre application est-elle réveillée (didReceiveRemoteNotification) en arrière-plan lorsque vous utilisez " B " ou " C "?
DerBernie
Je constate un comportement similaire, je pense que c'est peut-être parce que j'essaie cela depuis un moment et que je n'ai pas configuré correctement l'application au début, alors Apple peut m'avoir étranglé avant que la configuration ne soit correcte.
nickthedude
4
Mec ... j'aimerais pouvoir vous donner 10 votes
Michael Wiles
Regardez si vous cochez la Background fetchcase Project Capabilities> Background Modescar la première option devrait fonctionner. La transmission silencieuse n'a pas besoin d'un attribut sonore et arrive toujours application:didReceiveRemoteNotification:fetchCompletionHandler:même si l'application s'exécute en arrière-plan / au premier plan ou n'est pas en cours d'exécution.
IgniteCoders

Réponses:

73

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

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

ÉDITER

Les personnes ayant ce problème peuvent vouloir consulter ce lien . J'ai participé à un fil de discussion sur le forum des développeurs d'Apple qui passe en revue tous les états de l'application et lorsque des push silencieux sont reçus et non reçus.

CMVR
la source
Merci pour le lien. Plusieurs discussions traitent de cela sur les forums ADC. Bottom line: il y a un bug - après le redémarrage de l'appareil - qu'un représentant Apple a reconnu devrait être corrigé dans une mise à jour (éventuellement).
SG1
3
Dans iOS7, cela fonctionne très bien même sans touches sonores / d'alerte. Le contenu disponible est une clé suffisante! Mais dans iOS8, nous avons un comportement vraiment étrange lorsque même nous définissons une clé d'alerte avec une chaîne non vide en plus de "content-available": 1 nous obtenons uniquement une bannière avec une chaîne "alert", mais "content-available" est ignoré pour certaines raisons
malex
J'ai eu du succès avec le lancement de l'application à partir de la notification avec ou sans le son ajouté. Peut-être que la définition d'un son, d'une alerte ou d'un badge (vide ou non) augmente la priorité de notification par défaut à 10, augmentant ainsi sa fiabilité. Voyez ce qu'Apple dit à propos de la priorité des panoramiques: developer.apple.com/library/ios/documentation/ ... La priorité par défaut est 10 (élevée), mais c'est une erreur de l'utiliser pour les notifications push avec uniquement la clé disponible pour le contenu. Alors peut-être que la valeur par défaut est définie sur 5 si seule la clé disponible pour le contenu est définie.
emem
1
ne fonctionne pas sur iOS10. Je dois pousser quelque chose pour "sonner".
Stony
J'ai travaillé sur iOS10 pour moi. Mais ne fonctionne pas maintenant sur iOS11
Slav
30

Je viens donc de rencontrer ce problème hier, et après avoir essayé d'envoyer une charge utile avec un son réglé sur une chaîne vide, cela provoquait toujours des vibrations / sons sur l'appareil. Finalement, je suis tombé sur un article de blog d'Urban Airship qui suggérait de devoir 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. Fournissez 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 l'appareil. C'est une erreur d'utiliser cette priorité pour un push qui ne contient que la clé disponible au contenu.

5 Le message push est envoyé à un moment qui permet d'économiser de l'énergie sur l'appareil 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;
    };
Dave Lyon
la source
Excellente réponse Dave! Une priorité de 5 est autorisée alors que «c'est une erreur d'utiliser cette priorité [10] pour un push qui contient uniquement la clé disponible au contenu». developer.apple.com/library/ios/documentation/…
rjobidon
4
La priorité doit-elle être incluse dans la charge utile? OMI, il est séparé d'un octet dans le push que vous envoyez.
Foriger
6
La priorité n'est pas définie dans la charge utile. Cela est défini dans la notification binaire.
Sandy D.
10

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

JaimeFBC
la source
Cette solution avec alert=""la charge utile a également fonctionné pour moi iOS 9.0. Le sound=""n'a pas fonctionné à la place.
loretoparisi
5

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

On dirait: entrez la description de l'image ici

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,
    }
}

  • seule alerte

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

  • seul son

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

wenghengcong
la source
4

Cela fonctionne pour moi:

{ 
  aps: { 
          content-available: 1 
       }
}

Regardez si vous cochez la Background fetchcase Project Capabilities>Background Modes

IgniteCoders
la source
2

Je vois le même problème. Si j'envoie un push avec "content-available": 1 et aucun autre attribut 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 du badge car cela n'alerte en aucune façon l'utilisateur, à part l'ajout du badge à l'icône.

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

Jon C
la source
1

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)

dev03
la source
0

Argh! Tirant également mes cheveux - ce n'est pas tant une réponse qu'un autre exemple de charge utile qui NE FONCTIONNE PAS. La méthode didReceiveRemoteNotification n'est jamais appelée, bien que si le périphérique est en veille, le texte d'alerte EST affiché.

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

logiciel évolué
la source
2
Si l'application est en arrière-plan, et si vous supprimez l'attribut 'alert', vous devriez recevoir le rappel dans l'application: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon et si je veux voir l'alerte (push régulier) en BG + invoquez l'application: didReceiveRemoteNotification: fetchCompletionHand‌ ler:? Tnx
DaNLtR
0

Mettre le 'son' à 0 ​​a fonctionné pour moi ... :)

Alex Zak
la source
0

la définition de la priorité sur 5 ne fonctionnait pas pour moi, mais la définition du son ou de l'alerte sur une chaîne vide entraînait le traitement de la notification comme une notification de haute priorité

Radim
la source
0

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

{
    aps =     {
        alert =         {
            body = "";
            title = "";
        };
        badge = 103;
        "content-available" = 1;
        sound = "";
    };
}
Accorder de la chance
la source