Die stille Push-Benachrichtigung in iOS 7 funktioniert nicht

87

In der Präsentation "Was ist neu bei Multitasking?" Der WWDC 2013 gibt es einen Abschnitt über stille Push-Benachrichtigungen. Es scheint einfach zu sein. Laut Präsentation werden Benutzer nicht über die Benachrichtigung benachrichtigt, wenn Sie die APS-Nutzdaten nur mit dem verfügbaren Inhalt auf 1 senden.

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

Meine Tests haben gezeigt, dass dies nicht funktioniert, da kein Push empfangen wird. Aber wenn ich das Sound-Attribut einbinde, aber das Alert-Attribut ausschließe, funktioniert es (obwohl es nicht mehr still ist).

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

Wenn ich jedoch das Soundattribut ändere, um ein leises Audio abzuspielen, kann ich einen leisen Push nachahmen.

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

Weiß jemand:

  1. Ist das ein Fehler?
  2. Und wenn es richtig ist anzunehmen, dass B oder C als Remote-Benachrichtigung behandelt wird (und nicht als Fehler bei Silent Push, bei dem Sie ein Sound-Attribut benötigen)? Wenn ja, bedeutet dies, dass die Rate nicht wie bei Silent Pushes begrenzt ist ... was Apple wahrscheinlich beheben wird. Also sollte ich mich wahrscheinlich nicht darauf verlassen.
  3. Was ist das Ratenlimit (N drückt alle X Sekunden usw.)?

Danke im Voraus.

Mit weiteren Informationen bearbeiten

Für A spielt der Status der Anwendung keine Rolle. Eine Benachrichtigung wird nie empfangen.

Es scheint, als ob B und C nur funktionieren, wenn Sie die Attribute und Werte wie unten in Anführungszeichen setzen.

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

Und die Benachrichtigung kommt in der Anwendung an: didReceiveRemoteNotification: fetchCompletionHandler: unabhängig vom Status.

mkwon
quelle
Funktioniert es in keinem App-Status? Für mich funktioniert " A ", solange die App im Vordergrund läuft (didReceiveRemoteNotification wird aufgerufen). Aber wenn die App nicht läuft, wird die App nicht benachrichtigt (ich höre nur den Ton, wenn ich " B " versuche ). Wird Ihre App im Hintergrund geweckt (didReceiveRemoteNotification), wenn Sie " B " oder " C " verwenden?
DerBernie
Ich sehe ein ähnliches Verhalten, ich denke, es könnte daran liegen, dass ich dies eine Weile versucht habe und die App zunächst nicht richtig eingerichtet war, sodass Apple mich möglicherweise gedrosselt hat, bevor ich das Setup korrekt hatte.
Nickthedude
4
Alter ... Ich wünschte, ich könnte dir 10 Stimmen geben
Michael Wiles
Überprüfen Sie, ob Sie das Kontrollkästchen > Background fetchaktivieren, da die erste Option funktionieren sollte. Silent Push benötigt kein Soundattribut und kommt immer an, auch wenn die Anwendung im Hintergrund / Vordergrund ausgeführt wird oder nicht ausgeführt wird. Project CapabilitiesBackground Modesapplication:didReceiveRemoteNotification:fetchCompletionHandler:
IgniteCoders

Antworten:

73

Dies funktioniert auch und spielt keinen Ton ab, wenn er eintrifft:

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

BEARBEITEN

Personen mit diesem Problem möchten möglicherweise diesen Link überprüfen . Ich habe an einem Thread im Entwicklerforum von Apple teilgenommen, der alle App-Status abdeckt und wenn stille Pushs empfangen und nicht empfangen werden.

CMVR
quelle
Danke für den Link. In den ADC-Foren wird dies in mehreren Threads diskutiert. Fazit: Nach dem Neustart des Geräts gibt es einen Fehler, den ein Apple-Mitarbeiter bestätigt hat und der (eventuell) in einem Update behoben werden sollte.
SG1
3
In iOS7 funktioniert es auch ohne Sound- / Alarmtasten. Inhaltlich verfügbar ist ausreichend Schlüssel! Aber in iOS8 haben wir ein wirklich seltsames Verhalten, wenn wir zusätzlich zu "content-available" auch einen Alarmschlüssel mit einer nicht leeren Zeichenfolge festlegen: 1 Wir erhalten nur ein Banner mit einer "alert" -String, aber "content-available" wird aus bestimmten Gründen ignoriert
Malex
Ich hatte Erfolg beim Starten der App von der Benachrichtigung mit oder ohne den hinzugefügten Sound. Wenn Sie einen Ton, eine Warnung oder ein Abzeichen (leer oder nicht) festlegen, wird die Standardbenachrichtigungspriorität möglicherweise auf 10 erhöht, wodurch die Zuverlässigkeit erhöht wird. Lesen Sie, was Apple über die Pfannenpriorität sagt: developer.apple.com/library/ios/documentation/… Die Standardpriorität ist 10 (hoch). Es ist jedoch ein Fehler, diese für Push-Benachrichtigungen nur mit inhaltsverfügbarem Schlüssel zu verwenden. Daher ist der Standardwert möglicherweise auf 5 festgelegt, wenn nur der für den Inhalt verfügbare Schlüssel festgelegt ist.
Emem
1
funktioniert nicht unter iOS10. Ich muss etwas drücken, um "zu klingen".
Stony
Arbeitete unter iOS10 für mich. Funktioniert aber jetzt nicht unter iOS11
Slav
30

Ich bin gestern auf dieses Problem gestoßen, und nachdem ich versucht hatte, eine Nutzlast mit einem Sound zu senden, der auf eine leere Zeichenfolge eingestellt war, verursachte es immer noch Vibrationen / Geräusche auf dem Gerät. Schließlich stolperte ich über einen Blog-Beitrag von Urban Airship, in dem vorgeschlagen wurde, Folgendes zu senden:

{ priority: 5 }

in der Push-Benachrichtigung, die ich noch nie gesehen hatte. Nachdem ich Apples Dokumente nach Push-Benachrichtigungen durchsucht hatte, stolperte ich über diese Seite:

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

Dies zeigt an, dass die Priorität auf "5" oder "10" gesetzt werden sollte, und erklärt:

Die Priorität der Benachrichtigung. Geben Sie einen der folgenden Werte an:

10 Die Push-Nachricht wird sofort gesendet.

Die Push-Benachrichtigung muss eine Warnung, einen Ton oder ein Abzeichen auf dem Gerät auslösen. Es ist ein Fehler, diese Priorität für einen Push zu verwenden, der nur den inhaltsverfügbaren Schlüssel enthält.

5 Die Push-Nachricht wird zu einem Zeitpunkt gesendet, der die Stromversorgung des empfangenden Geräts spart.

Letztendlich konnten wir stille Push-Benachrichtigungen mit einer Ausweisanzahl (und ich vermute, Sie könnten dasselbe sogar mit einer Warnung tun) mit dem folgenden Format erhalten:

    aps =     {
        badge = 7;
        "content-available" = 1;
        priority = 5;
    };
Dave Lyon
quelle
Tolle Antwort Dave! Eine Priorität von 5 ist zulässig, während "es ein Fehler ist, diese Priorität [10] für einen Push zu verwenden, der nur den inhaltsverfügbaren Schlüssel enthält." developer.apple.com/library/ios/documentation/…
rjobidon
4
Sollte die Nutzlast Priorität haben? IMO ist es ein separates Byte in Push, das Sie senden.
Foriger
6
Die Priorität wird in der Nutzlast nicht festgelegt. Dies wird in der binären Benachrichtigung festgelegt.
Sandy D.
10

Ich habe versucht, eine leere Zeichenfolge als Alarmattribut festzulegen, und es hat auch funktioniert:

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

Es scheint, als würde APNS die Existenz dieser Attribute prüfen, um die Push-Nutzdaten zu validieren. Interessanterweise überprüfen sie nicht den tatsächlichen Inhalt. Es scheint ein bisschen hacky ...

JaimeFBC
quelle
Diese Lösung mit alert=""in der Nutzlast hat auch bei mir funktioniert iOS 9.0. Das sound=""hat stattdessen nicht funktioniert.
Loretoparisi
5

Ich benutze das Tool - Knuff sende meine Push-Benachrichtigung an mein Gerät.

Es sieht aus wie: Geben Sie hier die Bildbeschreibung ein

Dann habe ich dieses Beispiel ausprobiert.

Sie sind alle Arbeit! Aber Sie müssen die Priorität 10 setzen!

Wenn Sie das Tool also nicht verwenden, notieren Sie es auch.


Beispiele:

  • Kein Alarm, kein Ton

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

  • nur Alarm

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

  • nur Ton

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

wenghengcong
quelle
4

Das funktioniert bei mir:

{ 
  aps: { 
          content-available: 1 
       }
}

Überprüfen Sie, ob Sie das Kontrollkästchen Background fetchin Project Capabilities> aktivierenBackground Modes

IgniteCoders
quelle
2

Ich sehe das gleiche Problem. Wenn ich einen Push mit "content-available": 1 sende und keine anderen Attribute festgelegt sind, wird die Benachrichtigung nie empfangen. Wenn ich andere Attribute hinzufüge, funktioniert es perfekt.

Als vorübergehende Umgehung füge ich das Ausweisattribut hinzu, da dies den Benutzer in keiner Weise alarmiert, außer das Ausweis zum Symbol hinzuzufügen.

Lassen Sie mich wissen, wenn Sie eine bessere Lösung gefunden haben.

Jon C.
quelle
1

Die Priorität sollte als ein Element im Binärstrom festgelegt werden, jedoch nicht in der Payload-JSON-Zeichenfolge. Anscheinend kann nur das neueste Typ 2-Format zum Festlegen der Priorität wie folgt verwendet werden:

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

Formattypen (erstes Byte) für die Remote-Benachrichtigungs-Binärnachricht:

0 - einfach (alt) 1 - erweitert (alt) 2 - aktuell mit mehr Parametern (neu)

dev03
quelle
0

Argh! Ich ziehe mir auch die Haare aus - dies ist weniger eine Antwort als vielmehr ein weiteres Beispiel für eine Nutzlast, die NICHT funktioniert. Die didReceiveRemoteNotification-Methode wird niemals aufgerufen. Wenn das Gerät in den Ruhezustand wechselt, wird der Warnungstext angezeigt.

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

"apt" ist ein benutzerdefiniertes Feld, in dem der Benachrichtigungstyp angegeben wird.

Software entwickelt
quelle
2
Wenn sich die App im Hintergrund befindet und Sie das Attribut 'alert' entfernen, sollten Sie den Rückruf in der Anwendung erhalten: didReceiveRemoteNotification: fetchCompletionHandler:
mkwon
@mkwon und wenn ich die Warnung (regulärer Push) sehen möchte, während ich in BG + die Anwendung aufrufe: didReceiveRemoteNotification: fetchCompletionHand‌ ler :? Tnx
DaNLtR
0

Das Setzen von 'Sound' auf 0 hat bei mir funktioniert ... :)

Alex Zak
quelle
0

Das Setzen der Priorität auf 5 hat bei mir nicht funktioniert, aber das Setzen von Sound oder Alarm auf eine leere Zeichenfolge hat dazu geführt, dass die Benachrichtigung als Priorität mit hoher Priorität behandelt wurde

Radim
quelle
0

Wir hatten das gleiche Problem, ohne dass eine Benachrichtigung zugestellt wurde. In unserem Fall haben wir einen stillen Push verwendet, um die Ausweisnummer zu aktualisieren. Wenn wir leere Zeichenfolgen für Alarm (Text und Titel) und Ton festlegen, funktioniert dies, aber wenn eine der Tasten nicht vorhanden ist, ist dies fehlgeschlagen. Folgendes hat funktioniert: Aktualisieren des Abzeichens ohne Ton oder Warnung (Protokoll des resultierenden userInfo-Wörterbuchs in didReceiveRemoteNotification)

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