Wenn ich Apple Docs lese, erwähnen sie drei Arten von Benachrichtigungen: lokal, remote und stumm.
Lokale Benachrichtigung kann aus dem Namen abgeleitet werden, der von der App lokal gesendet wird.
Was ist jedoch der Unterschied zwischen den beiden anderen Typen?
BEARBEITEN: Obwohl diese Antwort vollständig zutreffend ist, gibt es einige Ergänzungen (keine Änderungen) an Benachrichtigungen in iOS 12. Ich empfehle dringend, WWDC 2018: Was ist neu in Benutzerbenachrichtigungen und siehe hier .
Hauptänderungen sind:
Es müssen zu viele Einstellungen vorgenommen werden, damit es funktioniert. Ich werde versuchen, sie zu zerlegen und sie verständlicher zu machen.
Insgesamt sind mehrere Dinge wichtig.
content-available
Ich kann jedem nur empfehlen, die ersten 7 Minuten von: WWDC 2015: Was ist neu in Notifications . Von dort aus erwähnt der Moderator, dass es zwei Haupttypen von Benachrichtigungen gibt:
Sie treten im Hintergrund auf, sodass Sie nie einen Alarm/ein Abzeichen/einen Ton sehen. Dinge werden heruntergeladen ohne Sie wissen davon.
iOS 11 Bug
Siehe hier . Die ersten Versionen von iOS 11 waren fehlerhaft für stille Benachrichtigungen. Stellen Sie sicher, dass Sie die neueste Version für Ihre Tests haben, da dies sonst möglicherweise nicht funktioniert
Wie der Name schon sagt, hat es etwas mit user zu tun. Das heißt, der Benutzer sieht eine Warnung/einen Ausweis oder hört einen Ton. Es gibt 2 Arten.
Lokale Benachrichtigungen
Eine lokale Benachrichtigung kann ausgelöst werden auf 3 verschiedene Arten:
UNLocationNotificationTrigger
: Sie sehen eine Warnung, wenn Sie sich in der Nähe eines Walmart-Geschäfts befinden.
UNTimeIntervalNotificationTrigger
: z.B. Sie sehen alle 10 Minuten eine Warnung.
UNCalendarNotificationTrigger
wie am 1. Dezember um 13:00 Uhr 2017.
Remote Notifications
Sie ähneln localNotifications, werden jedoch vom Server ausgelöst, z. Eine WhatsApp-Nachricht mit einem Von-Feld (Mama) und einem Körperfeld (Ich liebe dich!).
Einige zufällige Notizen:
Um eine stille oder Remote-Benachrichtigung zu erhalten, müssen Sie sich für ein Token registrieren.
application.registerForRemoteNotifications()
???? Für die Registrierung ist KEINE Benutzerberechtigung erforderlich. Dadurch werden stille Benachrichtigungen nahtlos. Siehe diesen Moment des WWDC-Videos
Stille Benachrichtigungen sind standardmäßig aktiviert. Der Benutzer muss Ihre nicht genehmigen - erteilt Ihrer App keine Berechtigung, um sie zu verwenden, und Sie können einfach mit der Verwendung beginnen, ohne den Benutzer um Erlaubnis zu bitten.
Um in der Lage zu sein show Abzeichen/Warnungen/Töne, müssen Sie Erlaubnis anfordern vom Benutzer:
UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, error) in
guard error == nil else {
//Display Error.. Handle Error.. etc..
return
}
if granted {
//Do stuff here..
//Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
application.registerForRemoteNotifications()
}
else {
//Handle user denying permissions..
}
}
Frage: Muss ich den Zugriff einmal für lokale Benachrichtigungen und einmal für Remotebenachrichtigungen anfordern?
Nein. Schreiben Sie einfach das obige Snippet und es fordert den Zugriff für beide remote und local an.
Kommen wir nun zum schwierigen Teil: D
Muss ich etwas aktivieren, um stille Benachrichtigungen zu erhalten?
Wenn Sie dies nicht aktivieren, erhält Ihre App kein Token. Und ohne Token erkennt der Server Sie nicht.
Um backgroundModes zu aktivieren, können Sie entweder mithilfe Ihrer plist - oder Xcode-Funktionen .
Der Grund, warum Sie dies so oder so tun können, ist folgender: plist ist näher an Ihrem Code und ist der alte Weg, vielleicht dient er der Unterstützung älterer Versionen. Xcode-Funktionen sind der neuere und einfachere Weg.
plist:
Element 0 ist nur ein Index, es ist nicht der Schlüssel eines Wörterbuchs (etwas, das Sie normalerweise in plist sehen), der UIBackgroundModes ist ein array
von Strings. Die Zeichenfolgen dürfen nur von einem akzeptierten Wert aus dem UIBackgroundModes-Array stammen.
Xcode-Funktionen:
Überprüfen Sie den Remote Notification
In Xcode unter Hintergrundmodi wie folgt:
Wenn Sie keine der oben genannten Aktionen ausführen, deaktivieren Sie Benachrichtigungen mit:
wird töten Remote & Local Notifications
Jedoch Wenn Sie do die Hintergrundaktualisierung der App über Plist- oder Xcode-Funktionen aktivieren, erhalten Sie auch bei deaktivierten Benachrichtigungen für die App stille Benachrichtigungen!
Wenn der Benutzer stille Benachrichtigungen deaktivieren möchte, muss er beide Benachrichtigungen deaktivieren und die Aktualisierung der Hintergrund-App für Ihre App/für das gesamte System deaktivieren. So deaktivieren Sie die Aktualisierung der Hintergrund-App auf Ihrem System:
Warum sage ich das alles? Um Ihnen zu erklären, dass settings von Silent- und Push-Benachrichtigungen für den Benutzer unterschiedlich sind und die Einschränkungen für das Senden unterschiedlich sind. Weitere Informationen finden Sie in diesem Moment aus dem WWDC-Video. Siehe hier statt (vorheriger Link war tot):
Stille Benachrichtigungen sind standardmäßig aktiviert.
Der Benutzer muss nicht zustimmen, dass er Ihrer App keine Berechtigung erteilt, um sie zu verwenden, und Sie können einfach mit der Verwendung beginnen, ohne den Benutzer um Erlaubnis zu bitten.
Stille Benachrichtigungen sind jedoch der Mechanismus für die Aktualisierung der Hintergrund-App.
Sie wissen jederzeit, dass der Benutzer Einstellungen vornehmen und deaktivieren kann.
Sie können sich also nicht darauf verlassen, dass sie immer verfügbar sind.
Sie wissen nicht, ob der Benutzer sie ausschaltet, und Sie erhalten keine Benachrichtigung mehr.
Dies bedeutet auch, dass stille Benachrichtigungen mit dem besten Aufwand zugestellt werden.
Das bedeutet, dass das System einige Entscheidungen trifft, wenn die Benachrichtigung auf dem Gerät des Benutzers eintrifft.
Es werden unterschiedliche Signale vom Gerät und vom Benutzerverhalten verwendet, z. B. Strom oder Tageszeit, um zu entscheiden, wann der Zeitpunkt für die Zustellung der Benachrichtigung und den Start Ihrer App günstig ist.
Möglicherweise wird versucht, den Akku zu schonen, oder es wird versucht, dem Benutzerverhalten zu entsprechen und den Inhalt verfügbar zu machen, wenn der Benutzer ihn mit höherer Wahrscheinlichkeit verwendet.
Siehe auch hier .
CAVEAT: Auch wenn Sie die App-Hintergrundaktualisierung deaktivieren und Benachrichtigungen zulassen deaktivieren, können Sie stille Benachrichtigungen erhalten, wenn sich Ihre App im Vordergrund befindet. Befindet sich Ihre App im Hintergrund, werden sie nicht ausgeliefert.
Muss ich etwas aktivieren, um Remote-Benachrichtigungen zu erhalten?
Sie müssen lediglich Push Notifications in Ihren Xcode-Funktionen aktivieren:
Wenn Sie dies nicht aktivieren, erhält Ihre App kein Token. Und ohne Token erkennt der Server Sie nicht.
Neugierig ... Kannst du mir sagen, wie meine Nutzlast aussehen soll?
Ich empfehle Ihnen sehr, Apple zu sehen§ Dokumentation . Es ist sehr klar.
Danke, aber kannst du mir nur die wichtigen Teile erzählen?
ähm ... OK, aber nur damit Sie wissen, dass dies von dem Link stammt, den ich gerade gesagt habe:
Für Stille Benachrichtigungen gibt es zwei Kriterien:
aps
-Lexikon der Payload muss den content-available
- Schlüssel mit dem Wert 1
Enthalten.aps
dictionary dürfen nicht die Schlüssel alert
, sound
oder badge
enthalten.Eine Beispielnutzlast würde folgendermaßen aussehen:
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
acme1, acme2 oder nur einige benutzerdefinierte Daten! Aber für die Taste aps
MÜSSEN Sie die Struktur von Apple befolgen, da sie andernfalls nicht map korrekt ist und Sie die Daten nicht korrekt lesen können.
Für Remote Notifications:
Sie benötigen einen alert
Schlüssel in Ihrem aps
.
Als Beispiel:
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
Es gibt auch eine dritte Option, auf die ich später noch eingehen werde.
Informationen zu den festen aps
- und alert
-Wörterbuchschlüsseln finden Sie in diesen Apple-Dokumenten .
OK habe es. Was ist content-available
?
Sehr einfach. Es ist nur eine Flagge, die Ihrer App mitteilt, dass Sie aufwachen und etwas herunterladen müssen, da ich Inhalte zum Herunterladen zur Verfügung habe! Weitere Informationen finden Sie in diesem genauen Moment .
Standardmäßig ist das Flag content-available
Nicht enthalten, d. H., Standardmäßig lösen die von Ihnen gesendeten Benachrichtigungen werden nicht gesendetapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)
aus oder führen eine Aktion in Ihrer App aus. Es würde nur die Benachrichtigung anzeigen. Wenn Sie die App aktivieren möchten (um etwas im Hintergrund zu tun), müssen Sie content-available
Einfügen und auf 1
Setzen.
§: Wenn Sie Firebase verwenden, können sich die Nutzlaststruktur und die Schlüssel geringfügig unterscheiden. Beispielsweise wird der Schlüssel
content-available
Durchcontent_available
Ersetzt. Weitere Informationen finden Sie in der Firebase-Dokumentation und auch hier .
Ich weiß, dass Sie mir gesagt haben, dass ich nur dann etwas in meine App herunterladen kann, wenn ich stille Benachrichtigungen verwende. Gibt es eine Möglichkeit, meine App auch im Hintergrund zu aktivieren UND etwas für Remote-Benachrichtigungen herunterzuladen?
Ja, aber ähnlich wie bei der stillen Benachrichtigung müssen Sie auch das Flag content-available
Auf 1 setzen, damit es weiß, dass es aufgeweckt und heruntergeladen werden muss. Andernfalls wird nur Pop und Alert/Badge/Sound ausgegeben, es wird jedoch nichts heruntergeladen.
WICHTIGE NOTIZEN:
content-available
Für jede Nutzlast auf 1
.content-available
Gibt es nichts zu tun.content-available
Auf 1
.(DRITTE WAHL)
{
"aps" : {
"content-available" : 1
"alert" : "You got your emails.",
"badge" : 9,
"sound" : "bingbong.aiff"
},
"acme1" : "bar",
"acme2" : 42
}
In diesem Moment aus dem WWDC-Video wird der ????
Ich bin verwirrt über Remote-Benachrichtigungen. Ich dachte, wenn ich eine Benachrichtigung bekomme, wird meine App im Hintergrund aktiv und lädt etwas herunter. Können Sie das erklären?
z.B. in diesem Moment:
Ihr iPhone hat gerade eine Remote-Benachrichtigung mit dem Status "Kein Absender" erhalten. Um dies zu erhalten, muss WhatsApp does im Hintergrund ausgeführt werden, d. H. Sie müssen "Remote Notifications" nicht in BackgroundModes aktivieren. Sie erhalten die Benachrichtigung auch dann, wenn Ihre App beendet oder angehalten wurde, da der Prozess vom Betriebssystem und nicht von der WhatsApp-App verwaltet wird. Wenn Sie jedoch in der Lage sein möchten, die eigentliche Nachricht oder ihr Bild/Video auf WhatsApp herunterzuladen (damit das Video nach dem Öffnen von WhatsApp dort auf den Benutzer wartet), müssen Sie Ihre App aktivieren . Dazu benötigen Sie content-available : 1
Und implementieren application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
.
Wenn Sie die Mobilfunkdaten für eine App deaktiviert haben, werden Sie trotzdem benachrichtigt. Wenn Sie jedoch auf diese Benachrichtigung tippen, kann der Benutzer wird keine Netzwerkanforderungen stellen für diese App. Sie könnten nur öffnen die App.
In einem ähnlichen Szenario können Sie jedoch auch Benachrichtigungen über APNs erhalten, wenn der Server/Zugriffspunkt, mit dem Sie verbunden sind, beispielsweise für WhatsApp über eingeschränkten Zugriff verfügt. Wenn Sie jedoch auf diese Benachrichtigung tippen, kann der Benutzer wird keine Netzwerkanforderungen stellen für diese App. Sie könnten nur öffnen die App.
CAVEAT: Wenn die App vom Benutzer zwangsweise beendet wurde, können Sie nichts tun, um die App automatisch aus dem Status "Beendet" zu bringen, obwohl Sie die Benachrichtigung aus den oben genannten Gründen erhalten (Auch wenn Sie content-available
auf 1
gesetzt hatten). Keine Ihrer Delegate-Methoden wäre betroffen. Der user muss die App öffnen und erst dann werden Ihre Delegate-Methoden erreicht.
Ein Hinweis zu Zuverlässigkeit und APNs-Architektur: Obwohl Benachrichtigungen häufig verwendet werden, um den eigentlichen Inhalt an die App zu übermitteln, sind sie in gewisser Weise NICHT dafür ausgelegt, zu liefern Inhalt an die App zu übermitteln . Vielmehr sollen sie benachrichtigen den Benutzer darüber informieren, dass "etwas Neues eingetroffen ist" (eine 2b-Nachricht oder ein 50-KB-kleines Bild oder ein 10-MB-Bild oder ein 2-GB-Video). Öffnen Sie die App, wenn Übrigens, hier ist ein kleines Stück davon (die eigentliche Nachricht selbst wenn passt, der Titel des Bildes oder ein in der Benachrichtigung angezeigtes Vorschaubild, ein Titel des Videos oder ein Vorschaubild im Video gezeigt ". Weitere Informationen finden Sie unter iOS APNS" best-effort "Fallback . Um es noch einmal zu wiederholen, laden Sie niemals den 40-MB-Anhang herunter, der in der E-Mail gesendet wurde. Sie erhalten nur Sie senden gerade genug (eine Miniaturansicht des Anhangs), damit der Benutzer über Neuigkeiten informiert wird und entscheiden kann, ob er die App für weitere öffnen muss. Als ich neu bei iOS war, dachte ich Sie senden das Bild/Video tatsächlich über die Push-Benachrichtigung.
Durch die Push-Benachrichtigung wird der Benutzer darüber informiert, dass er eine Benachrichtigung erhält (z. B. durch Anzeigen des Benachrichtigungs-Popups). Die stille Benachrichtigung wird aktualisiert, der Benutzer wird jedoch nicht darüber benachrichtigt. In jedem Fall können Sie Aktionen ausführen, wenn Sie mit der Option "Lautlos" benachrichtigt werden, als wäre es eine Push-Benachrichtigung. Der einzige Unterschied ist, dass der Benutzer keine Benachrichtigung mit der Popup-Benachrichtigung erhält.
Der Unterschied liegt in der Nutzlast:
Push-Benachrichtigung:
aps {
content-available: 1
alert: {...}
}
Stille Benachrichtigung:
aps {
content-available: 0
alert: {...}
}
Und Sie müssen in Capabilities den Hintergrundmodus einstellen, den Sie auswählen.
Die automatische Push-Benachrichtigung erreicht das Gerät, der Benutzer weiß nichts über die Benachrichtigung, aber seine App erhält die Benachrichtigung und erhält eine gewisse Zeit, um neue Inhalte herunterzuladen und dem Benutzer anzuzeigen, unabhängig vom Status der App (dh ob sie ausgeführt wird oder nicht) Laufen)
Die Remote-Push-Benachrichtigungsmethode wird nur aufgerufen, wenn Ihre App ausgeführt wird. Wenn die App angehalten wird oder nicht ausgeführt wird, wird die App vom System aktiviert oder gestartet und in den aktiven Hintergrundstatus versetzt, bevor die Methode aufgerufen wird. Diese Methode dient zum Anzeigen des aktualisierten Inhalts für den Benutzer. Wenn diese Methode aufgerufen wird, verfügt Ihre App über eine Wanduhrzeit von bis zu 30 Sekunden, um den Download-Vorgang auszuführen und den angegebenen Completion-Handler-Block aufzurufen. Wenn der Handler nicht rechtzeitig aufgerufen wird, wird Ihre App angehalten.
Für weitere technische Details können Sie diese Links durchgehen: