wake-up-neo.com

Was ist der Unterschied zwischen Remote-Benachrichtigung und stiller Benachrichtigung in iOS?

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?

34
transang

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:

  • gruppenbenachrichtigungen
  • vorläufige Meldungen
  • kritische Benachrichtigungen
  • fähigkeit, mit den Benachrichtigungen in den Erweiterungen zu interagieren

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.

  • der allgemeine Unterschied zwischen einer silent und user Benachrichtigung
  • verschiedene Arten von Benutzer Benachrichtigungen
  • wie eine entfernte Benachrichtigung, d. h. die Nutzlast, von Ihrem Server aus konfiguriert wird
  • aktivieren von Push-Benachrichtigungen und Remotebenachrichtigungen aus den Hintergrundmodi in Ihrem Projekt
  • so registrieren Sie Ihr Token für remote und silent Benachrichtigungen
  • so fordern Sie die Berechtigung für Benutzer Benachrichtigungen an
  • aktivieren von "App-Aktualisierung im Hintergrund" und "Benachrichtigungen" über Gerät
  • was ist content-available
  • verstehen, dass das iOS Upstream für Ihre App ist, wenn es um den Empfang einer Remote-Benachrichtigung geht
  • was passiert, wenn das Betriebssystem Benachrichtigungen erhält, wenn die App vom Benutzer beendet wurde?
  • Ein Hinweis zu Zuverlässigkeit und APNs-Architektur

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:

Stille Benachrichtigungen

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


Benutzerbenachrichtigungen

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.

Von WWDC

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?

  1. Sie müssen Push Notifications über Ihre Xcode-Funktionen aktivieren:

enter image description here

Wenn Sie dies nicht aktivieren, erhält Ihre App kein Token. Und ohne Token erkennt der Server Sie nicht.

  1. Um Inhalte aus dem Hintergrund herunterladen zu können, müssen Sie Folgendes aktivieren: Fernbenachrichtigungen aus den Hintergrundmodi.

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:

enter image description here

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:

enter image description here

Wenn Sie keine der oben genannten Aktionen ausführen, deaktivieren Sie Benachrichtigungen mit:

enter image description here

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:

enter image description here

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:

enter image description here

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:

  • Das aps -Lexikon der Payload muss den content-available - Schlüssel mit dem Wert 1 Enthalten.
  • Die Nutzdaten des 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 Durch content_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:

  • Wenn Ihre App nur stille Benachrichtigungen enthält, aktivieren Sie einfach "Push-Benachrichtigungen" + "Remotebenachrichtigungen" in den Funktionen und setzen Sie content-available Für jede Nutzlast auf 1.
  • Wenn Ihre App nur Remotebenachrichtigungen enthält, aktivieren Sie einfach "Push-Benachrichtigungen" in den Funktionen. Für den content-available Gibt es nichts zu tun.
  • Wenn Sie jedoch möchten, dass Ihre Benachrichtigungen einen Alarm/ein Abzeichen/einen Ton anzeigen und auch etwas im Hintergrund herunterladen, müssen Sie sowohl "Remote-Benachrichtigungen" als auch "Push-Benachrichtigungen" aktivieren + 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:

enter image description here

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

141
Honey

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.

Mit Push-Benachrichtigung: enter image description here

Mit stiller Benachrichtigung: enter image description here

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.

6
Juan Curti

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:

Apple Notifications

Stille Benachrichtigungen

0
Bidisha Pyne