Ist es möglich zu wissen, ob die App über eine Push-Benachrichtigung gestartet / geöffnet wurde?
Ich denke, die Auftaktveranstaltung kann hier abgefangen werden:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions != nil) {
// Launched from push notification
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}
Wie kann ich jedoch anhand einer Push-Benachrichtigung erkennen, dass die App im Hintergrund geöffnet wurde?
Antworten:
Siehe diesen Code:
gleich wie
quelle
spät, aber vielleicht nützlich
Wenn die App nicht ausgeführt wird
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
wird genannt ..
Hier müssen Sie nach Push-Benachrichtigungen suchen
quelle
Das Problem bestand darin, die Ansicht nach dem Start der App korrekt zu aktualisieren. Hier gibt es komplizierte Sequenzen von Lebenszyklusmethoden, die verwirrend werden.
Lebenszyklusmethoden
Unsere Tests für iOS 10 ergaben die folgenden Sequenzen von Lebenszyklusmethoden für die verschiedenen Fälle:
Das Problem
Ok, jetzt müssen wir:
Das Knifflige ist, dass die Aktualisierung der Ansicht erfolgen muss, wenn die Anwendung tatsächlich aktiv wird. Dies ist in allen Fällen die gleiche Lebenszyklusmethode.
Skizze unserer Lösung
Hier sind die Hauptkomponenten unserer Lösung:
notificationUserInfo
Instanzvariable im AppDelegate.notificationUserInfo = nil
beideapplicationWillEnterForeground
und eindidFinishLaunchingWithOptions
.notificationUserInfo = userInfo
eindidReceiveRemoteNotification:inactive
applicationDidBecomeActive
Rufen Sie immer eine benutzerdefinierte Methode aufopenViewFromNotification
und übergeben Sieself.notificationUserInfo
. Wennself.notificationUserInfo
nil, kehren Sie frühzeitig zurück, andernfalls öffnen Sie die Ansicht basierend auf dem Benachrichtigungsstatus inself.notificationUserInfo
.Erläuterung
Wenn Sie von einem Push öffnen
didFinishLaunchingWithOptions
oderapplicationWillEnterForeground
immer unmittelbar vorher aufgerufen werdendidReceiveRemoteNotification:inactive
, setzen wir BenachrichtigungUserInfo zuerst in diesen Methoden zurück, damit kein veralteter Status vorliegt. WenndidReceiveRemoteNotification:inactive
dann aufgerufen wird, wissen wir, dass wir von einem Push aus öffnen, also setzen wir,self.notificationUserInfo
was dann aufgenommen wirdapplicationDidBecomeActive
, um den Benutzer zur richtigen Ansicht weiterzuleiten.Es gibt einen letzten Fall: Der Benutzer hat die App im App-Umschalter geöffnet (dh durch zweimaliges Tippen auf die Home-Taste, während sich die App im Vordergrund befindet) und erhält dann eine Push-Benachrichtigung. In diesem Fall wird nur
didReceiveRemoteNotification:inactive
aufgerufen, und weder WillEnterForeground noch didFinishLaunching werden aufgerufen, sodass Sie einen speziellen Status benötigen, um diesen Fall zu behandeln.Hoffe das hilft.
quelle
receive
Methoden öffnen , wenn der App-Status aktiv ist oder die App fortgesetzt wird. Dies kann zu Problemen beim Ändern von VCs führen, wenn die App noch inaktiv ist. Ihre Lösung sieht gut aus, bis Apple den Lebenszyklus erneut ändert.applicationWillResignActive
aufgerufen und dann dasapplicationDidBecomeActive
.applicationWillResignActive
Speichern Sie die empfangene Benachrichtigung nach dem Aufruf von oder erst, wenn einapplicationDidEnterBackground
oderapplicationDidBecomeActive
aufgerufen wird.Dies ist ein abgenutzter Beitrag ... aber es fehlt immer noch eine tatsächliche Lösung für das Problem (wie in den verschiedenen Kommentaren ausgeführt).
Der Grund kann im Anrufverlauf gesehen werden, wenn eine Benachrichtigung eintrifft.
application:didReceiveRemoteNotification...
wird aufgerufen, wenn die Benachrichtigung empfangen wird UND erneut, wenn der Benutzer auf die Benachrichtigung tippt. Aus diesem Grund können Sie nicht erkennen,
UIApplicationState
ob der Benutzer darauf getippt hat.Außerdem müssen Sie die Situation eines Kaltstarts der App nicht mehr bewältigen,
application:didFinishLaunchingWithOptions...
wieapplication:didReceiveRemoteNotification...
sie nach dem Start in iOS 9+ erneut aufgerufen wird (möglicherweise auch 8).Wie können Sie also feststellen, ob der Benutzer die Ereigniskette gestartet hat? Meine Lösung besteht darin, die Zeit zu markieren, zu der die App aus dem Hintergrund oder dem Kaltstart herauskommt, und diese Zeit dann einzuchecken
application:didReceiveRemoteNotification...
. Wenn es weniger als 0,1 Sekunden ist, können Sie ziemlich sicher sein, dass der Tipp den Start ausgelöst hat.Swift 2.x.
Swift 3
Ich habe dies für beide Fälle (App im Hintergrund, App läuft nicht) unter iOS 9+ getestet und es funktioniert wie ein Zauber. 0,1s ist auch ziemlich konservativ, der tatsächliche Wert ist ~ 0,002s, also ist 0,01 ebenfalls in Ordnung.
quelle
UNNotificationCenter
API verwenden, insbesondere die UNNotificationCenterDelegate-Methoden. Diese API-Aufruffunktion funktioniertuserNotificationCenter(UNUserNotificationCenter, didReceive: UNNotificationResponse, withCompletionHandler: @escaping () -> Void)
nur, wenn der Benutzer tatsächlich auf die Benachrichtigung getippt hat.applicationWillEnterForeground
Anruf. Infolgedessen erkennt die Lösung das Tippen nicht.UNUserNotificationCenter.current().delegate
in hinzufügenapplication:didFinishLaunchingWithOptions
, wird die AppuserNotificationCenter(didReceive response)
nach dem Tippen in dem von Ihnen beschriebenen Fall aufrufenWenn die App beendet wird und der Benutzer auf die Push-Benachrichtigung tippt
Wenn sich die App im Hintergrund befindet und der Benutzer auf die Push-Benachrichtigung tippt
Abhängig von Ihrer App kann es Ihnen auch einen stillen Push mit
content-available
Inside senden. Beachten Sieaps
dies auch :) Siehe https://stackoverflow.com/a/33778990/1418457quelle
Swift 2.0 für den Status "Nicht ausgeführt" (lokale und Remote-Benachrichtigung)
quelle
In
application:didReceiveRemoteNotification:
Prüfung , ob Sie die Mitteilung erhalten , wenn Sie Ihre App im Vordergrund oder im Hintergrund sind.Wenn es im Hintergrund empfangen wurde, starten Sie die App über die Benachrichtigung.
quelle
Für schnell:
quelle
Ja, Sie können mit dieser Methode in appDelegate Folgendes erkennen :
Für lokale Benachrichtigung:
quelle
wenn jemand die Antwort in schnell 3 will
quelle
Posting dies für Xamarin-Benutzer.
Der Schlüssel zum Erkennen, ob die App über eine Push-Benachrichtigung gestartet wurde, ist die
AppDelegate.FinishedLaunching(UIApplication app, NSDictionary options)
Methode und das übergebene Optionswörterbuch.Das Optionswörterbuch enthält diesen Schlüssel, wenn es sich um eine lokale Benachrichtigung handelt:
UIApplication.LaunchOptionsLocalNotificationKey
.Wenn es sich um eine Remote-Benachrichtigung handelt, ist dies der Fall
UIApplication.LaunchOptionsRemoteNotificationKey
.Wenn der Schlüssel ist
LaunchOptionsLocalNotificationKey
, ist das Objekt vom TypUILocalNotification
. Sie können dann die Benachrichtigung anzeigen und feststellen, um welche spezifische Benachrichtigung es sich handelt.Pro-Tipp:
UILocalNotification
Enthält keine Kennung, genausoUNNotificationRequest
wie. Fügen Sie einen Wörterbuchschlüssel in die UserInfo ein, der eine requestId enthält, damit beim Testen derUILocalNotification
eine bestimmte requestId zur Verfügung steht, auf der eine Logik basiert.Ich habe festgestellt, dass selbst auf iOS 10+ -Geräten, die beim Erstellen von Standortbenachrichtigungen mit dem
UNUserNotificationCenter
'sAddNotificationRequest
&UNMutableNotificationContent
, wenn die App nicht ausgeführt wird (ich habe sie beendet) und durch Tippen auf die Benachrichtigung im Benachrichtigungscenter gestartet werden, das Wörterbuch noch enthält dasUILocalNotificaiton
Objekt.Dies bedeutet, dass mein Code, der nach einem auf Benachrichtigungen basierenden Start sucht, auf iOS8- und iOS 10+ -Geräten funktioniert
quelle
Direkt aus der Dokumentation für
Wenn die App ausgeführt wird und eine Remote-Benachrichtigung erhält, ruft die App diese Methode auf, um die Benachrichtigung zu verarbeiten.
Ihre Implementierung dieser Methode sollte die Benachrichtigung verwenden, um geeignete Maßnahmen zu ergreifen.
Und ein bisschen später
Wenn die App beim Eintreffen einer Push-Benachrichtigung nicht ausgeführt wird, startet die Methode die App und stellt die entsprechenden Informationen im Wörterbuch für Startoptionen bereit.
Die App ruft diese Methode nicht auf, um diese Push-Benachrichtigung zu verarbeiten.
Stattdessen wird Ihre Implementierung des
oder
Die Methode muss die Nutzdaten der Push-Benachrichtigung abrufen und entsprechend reagieren.
quelle
Ich beginne mit einem Zustandsdiagramm, das ich für meinen eigenen Gebrauch erstellt habe, um es genauer zu visualisieren und alle anderen Zustände zu berücksichtigen: https://docs.google.com/spreadsheets/d/e/2PACX-1vSdKOgo_F1TZwGJBAED4C_7cml0bEATqeL3P9UKpBwASlT6ZkU3kk3 gid = 0 & single = true
Anhand dieser Tabelle können wir sehen, was tatsächlich erforderlich ist, um ein robustes Benachrichtigungshandhabungssystem zu entwickeln, das in fast allen möglichen Anwendungsfällen funktioniert.
Komplettlösung ↓
Hinweis: Eine ähnliche Antwort wird in Kommentaren zu Erics Antwort vorgeschlagen. Das Statusblatt hilft jedoch dabei, alle möglichen Szenarien zu finden, wie ich es in meiner App getan habe.
Bitte finden Sie den vollständigen Code unten und kommentieren Sie unten, wenn ein bestimmter Fall nicht behandelt wird:
AppDelegate
NotificationUtils : Hier können Sie Ihren gesamten Code schreiben, um zu verschiedenen Teilen der Anwendung zu navigieren, Datenbanken (CoreData / Realm) zu verwalten und alle anderen Aufgaben zu erledigen, die beim Empfang einer Benachrichtigung ausgeführt werden müssen.
quelle
quelle
Es gibt nur einen zuverlässigen Weg und er funktioniert nur für iOS 10+ :
Verwenden der
UNUserNotificationCenter
ImplementierungsmethodeUNUserNotificationCenterDelegate
:quelle
Sie können verwenden:
um die Remote-Push-Benachrichtigungen zu behandeln.
Überprüfen Sie hier die Dokumentation
quelle
Ich habe es noch nicht ausprobiert, aber vielleicht könnten Sie sich selbst eine Benachrichtigung senden? http://nshipster.com/nsnotification-and-nsnotificationcenter/
quelle
quelle
Das Problem bei dieser Frage ist, dass das "Öffnen" der App nicht genau definiert ist. Eine App wird entweder aus einem nicht laufenden Zustand kalt gestartet oder aus einem inaktiven Zustand reaktiviert (z. B. aus einer anderen App zurück zu ihr). Hier ist meine Lösung, um all diese möglichen Zustände zu unterscheiden:
Und
MXDefaults
ist nur eine kleine Hülle fürNSUserDefaults
.quelle
Zum
swift
quelle
Xcode 10 Swift 4.2
quelle
Unter iOS 10+ können Sie diese Methode verwenden, um festzustellen, wann auf Ihre Benachrichtigung geklickt wird, unabhängig vom Status der App.
quelle
M.Othman Antwort ist richtig für Anwendungen , die nicht enthalten Szene Delegat für Szene Delegate Apps Dies ist für mich gearbeitet iOS 13
Hier ist der Code, in den geschrieben werden soll, um die Szene zu verbinden
Code für App-Delegaten zur Unterstützung früherer Versionen didFinishLaunchingWithOptions
quelle
Für schnelle Benutzer:
Wenn Sie beim Öffnen von Push oder ähnlichem eine andere Seite starten möchten, müssen Sie sie
didFinishLaunchingWithOptions
wie folgt einchecken :quelle
IN SCHNELL:
Ich führe Push-Benachrichtigungen aus (mit Hintergrundabruf). Wenn sich meine App im Hintergrund befindet und ich eine Push-Benachrichtigung erhalte, habe ich festgestellt, dass didReceiveRemoteNotification in appDelegate zweimal aufgerufen wird. einmal, wenn eine Benachrichtigung empfangen wird, und einmal, wenn der Benutzer auf die Benachrichtigung klickt.
Um festzustellen, ob auf eine Benachrichtigung geklickt wurde, überprüfen Sie einfach, ob application'date raw value == 1 in didReceiveRemoteNotification in appDelegate enthalten ist.
Ich hoffe das hilft.
quelle
Wenn die App als Shanegao im Hintergrund ist, können Sie sie verwenden
Wenn Sie die Anwendung jedoch starten möchten und wenn die App geschlossen ist und Sie Ihre Anwendung debuggen möchten, gehen Sie zu Schema bearbeiten und wählen Sie im linken Menü Ausführen und dann beim Starten die Option Warten auf den Start der ausführbaren Datei. Anschließend starten Sie die Anwendung Klicken Sie auf Push-Benachrichtigung
Schema bearbeiten> Ausführen> Warten Sie, bis die ausführbare Datei gestartet wird
quelle