Détecter si l'application a été lancée/ouvert à partir d'une notification push
Est-il possible de savoir si l'application a été lancée/ouvert à partir d'une notification push?
Je suppose que l'événement de lancement peut être pris ici:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions != nil) {
//Launched from push notification
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}
Cependant, comment puis-je détecter, il a été ouvert à partir d'une notification push lorsque l'application est en arrière-plan?
- C'est un vieux, mais très utile post. Malheureusement, le haut réponses ne sont pas réels résoudre le problème (comme les commentaires l'indiquent). Veuillez envisager de marquer une réponse comme "accepté" puisque le présent n'est pas complète.
Vous devez vous connecter pour publier un commentaire.
Voir Ce code :
même que
application:didReceiveRemoteNotification:fetchCompletionHandler:
méthode à la place de celui-ci chaque fois que possible sur iOS7 et au-dessus.application:didReceiveRemoteNotification:fetchCompletionHandler:
ou bien la méthode ne sera pas déclenché lors de l'application de la re-lance.tard, mais peut-être utile
Lors de l'application n'est pas en cours d'exécution
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
est appelé ..
où u besoin de vérifier pour la notification push
La question nous avait été correctement mise à jour de la vue après l'application est lancée. Il y a compliqué les séquences du cycle de vie des méthodes ici que de la confusion.
Du Cycle De Vie Des Méthodes
Nos tests pour iOS 10 révélé les séquences suivantes du cycle de vie des méthodes pour les différents cas:
Le problème
Ok, alors maintenant, nous devons:
Le problème est que la mise à jour de la vue est le cas lorsque l'application devient réellement actif, qui est le même cycle de vie de la méthode dans tous les cas.
Croquis de notre solution
Voici les principales composantes de notre solution:
notificationUserInfo
variable d'instance sur l'AppDelegate.notificationUserInfo = nil
dans les deuxapplicationWillEnterForeground
etdidFinishLaunchingWithOptions
.notificationUserInfo = userInfo
dansdidReceiveRemoteNotification:inactive
applicationDidBecomeActive
toujours faire appel à une méthode personnaliséeopenViewFromNotification
et passerself.notificationUserInfo
. Siself.notificationUserInfo
est nil alors retourner tôt, sinon ouvrir la vue à partir de la notification de l'état trouvé dansself.notificationUserInfo
.Explication
Lors de l'ouverture d'un push
didFinishLaunchingWithOptions
ouapplicationWillEnterForeground
est toujours appelé immédiatement avantdidReceiveRemoteNotification:inactive
, nous avons d'abord réinitialiser notificationUserInfo dans ces méthodes, alors il n'y a pas vicié de l'état. Alors, sididReceiveRemoteNotification:inactive
est appelé nous savons que nous sommes de l'ouverture d'un push nous avons donc mis enself.notificationUserInfo
qui est ensuite capté parapplicationDidBecomeActive
renvoyer l'utilisateur à la vue de droite.Il y a un dernier cas qui est si l'utilisateur a l'application ouvert au sein de l'app switcher (c'est à dire en tapant deux fois sur le bouton de la maison pendant que l'application est au premier plan) et reçoit alors une notification push. Dans ce cas seulement
didReceiveRemoteNotification:inactive
est appelé, et ni WillEnterForeground ni didFinishLaunching est appelée, si vous avez besoin d'un spécial de l'état pour gérer ce cas.Espère que cette aide.
receive
méthodes lors de l'application de l'état est active ou l'application de la reprise. Qui peut entraîner des problèmes avec l'évolution de la VCs lorsque l'application est toujours inactif. Votre solution semble grand, jusqu'à ce qu'Apple change le cycle de vie de nouveau.applicationWillResignActive
est appelé, puis leapplicationDidBecomeActive
. Ainsi, après laapplicationWillResignActive
est appelé à ne pas enregistrer la notification reçue jusqu'à ce qu'unapplicationDidEnterBackground
ouapplicationDidBecomeActive
est appelé.didReceiveRemoteNotification
cessé de déclenchement lorsque j'ai mis en placeuserNotificationCenter(_:didReceive:withCompletionHandler:)
C'est un bien usé post... mais il lui manque encore une réelle solution pour le problème (comme il est indiqué dans les différents commentaires).
La raison peut être vu dans le flux d'appels lorsqu'une notification arrive,
application:didReceiveRemoteNotification...
qui est appelé lorsque la notification est reçue ET à nouveau lorsque la notification est tapé par l'utilisateur. De ce fait, vous ne pouvez pas dire simplement en regardant
UIApplicationState
si l'utilisateur taraudés il.En outre, vous n'avez plus besoin de gérer la situation d'un "démarrage à froid" de l'application dans
application:didFinishLaunchingWithOptions...
commeapplication:didReceiveRemoteNotification...
est appelée de nouveau après le lancement d'iOS 9+ (peut-être 8).Alors, comment pouvez-vous dire si l'utilisateur d'appuyer commencé à la chaîne des événements? Ma solution est de marquer l'heure à laquelle l'application commence à sortir de l'arrière-plan ou de démarrage à froid et ensuite vérifier que l'heure dans
application:didReceiveRemoteNotification...
. Si elle est inférieure à 0,1 s, alors vous pouvez être assez sûr que le robinet a déclenché le démarrage.Swift 2.x
Swift 3
J'ai testé ce pour les deux cas (application en arrière-plan, app pas en cours d'exécution) sur iOS 9+ et il fonctionne comme un charme. 0,1 s est assez conservatrice trop, la valeur réelle est d'environ 0.002 s 0.01 est très bien.
UNNotificationCenter
API, spécifiquement UNNotificationCenterDelegate méthodes. Ces appels de l'API funcuserNotificationCenter(UNUserNotificationCenter, didReceive: UNNotificationResponse, withCompletionHandler: @escaping () -> Void)
méthode uniquement lorsque l'utilisateur a réellement tapé sur la notification.applicationWillEnterForeground
appel, comme un résultat, la solution ne parvient pas à détecter le robinet.UNUserNotificationCenter.current().delegate
dansapplication:didFinishLaunchingWithOptions
, l'application fera appeluserNotificationCenter(didReceive response)
après le robinet dans le cas que vous avez décritSwift 2.0 Pour "Pas de Course" État (Local & Notification à Distance)
}
Lorsque l'application est terminée, et l'utilisateur appuie sur la notification push
Lorsque l'application est en arrière-plan, et l'utilisateur appuie sur le poussoir notificaion
En fonction de votre application, il peut également vous envoyer des silencieux pousser avec
content-available
à l'intérieur deaps
, donc être conscient de ce que bien : -) Voir https://stackoverflow.com/a/33778990/1418457Dans
application:didReceiveRemoteNotification:
de vérifier si vous avez reçu une notification lorsque votre application est au premier plan ou en arrière-plan.Si elle a été reçue à l'arrière-plan, le lancement de l'application à partir de la notification.
Pour swift:
Oui, vous pouvez détecter par cette méthode dans appDelegate:
De Notification locale:
si quelqu'un veut la réponse à swift 3
Ce détachement pour Xamarin utilisateurs.
La clé pour détecter si l'application a été lancée via une notification push est le
AppDelegate.FinishedLaunching(UIApplication app, NSDictionary options)
méthode, et les options de dictionnaire qui est passée.Les options de dictionnaire ont cette clé, si c'est une notification locale:
UIApplication.LaunchOptionsLocalNotificationKey
.Si c'est une notification à distance, il sera
UIApplication.LaunchOptionsRemoteNotificationKey
.Lorsque la clé est
LaunchOptionsLocalNotificationKey
, l'objet est de typeUILocalNotification
.Vous pouvez ensuite regarder la notification et de déterminer les notification qu'il est.
Pro-tip:
UILocalNotification
ne pas avoir un identifiant à elle, de la même façonUNNotificationRequest
n'. Mettre une clé de dictionnaire dans le UserInfo contenant un iddemande de sorte que lors de l'essai de laUILocalNotification
, vous aurez un spécifique iddemande à la disposition de la base de la logique sur.J'ai trouvé que même sur iOS 10+ périphériques lors de la création de l'emplacement des notifications à l'aide de la
UNUserNotificationCenter
'sAddNotificationRequest
&UNMutableNotificationContent
, que lorsque l'application n'est pas en cours d'exécution(je l'ai tué), et est lancé en appuyant sur la notification dans le centre de notification, que le dictionnaire contient toujours lesUILocalNotificaiton
objet.Cela signifie que mon code qui vérifie que la notification base de lancement de travaux sur iOS8 et iOS 10+ appareils
Directement à partir de la documentation pour
Si l'application est en cours d'exécution et reçoit une notification à distance, l'application appelle cette méthode, le processus de notification.
Votre mise en œuvre de cette méthode doit utiliser la notification de prendre les mesures qui s'imposent.
Et un peu plus tard
Si l'application n'est pas en cours d'exécution lorsqu'une notification push arrive, la méthode lance l'application et fournit les informations appropriées dans les options de lancement du dictionnaire.
De l'application ne pas appeler cette méthode pour traiter la notification push.
Au lieu de cela, votre mise en œuvre de la
ou
méthode doit obtenir la notification push de données de la charge utile et de répondre de façon appropriée.
Il y a un seul moyen fiable, et il ne fonctionne que pour iOS 10+ :
À l'aide de
UNUserNotificationCenter
mettre en œuvreUNUserNotificationCenterDelegate
méthode:Je vais commencer par un état graphique que j'ai créé pour mon propre usage afin de les visualiser avec plus de précision et de considérer tous les autres états:
https://docs.google.com/spreadsheets/d/e/2PACX-1vSdKOgo_F1TZwGJBAED4C_7cml0bEATqeL3P9UKpBwASlT6ZkU3iLdZnOZoevkMzOeng7gs31IFhD-L/pubhtml?gid=0&single=true
À l'aide de ce graphique, nous pouvons voir ce qui est réellement nécessaire pour développer une notification robuste système de traitement qui fonctionne dans presque tous les cas d'utilisation possibles.
Solution complète ↓
Réglez ce vrai dans applicationWillResignActive méthode,
Remarque: Une Semblable réponse est suggéré dans les commentaires sur Eric réponse, toutefois, l'état fiche d'aide à la recherche de tous les scénarios possibles, comme je l'ai fait dans mon application.
Vous trouverez le code complet ci-dessous et de commentaire ci-dessous si un cas concret, n'est pas géré:
AppDelegate
NotificationUtils : C'est là que vous pouvez écrire tous vos codes pour accéder à différentes parties de l'application, gestion des Bases de données(CoreData/Domaine) et faire toutes les autres choses qui doit être fait lorsqu'une notification est reçue.
Vous pouvez utiliser:
pour gérer la distance de notifications push.
Consultez ici l' la documentation
Je n'ai pas encore essayé, mais peut-être vous pourriez vous envoyer une notification? http://nshipster.com/nsnotification-and-nsnotificationcenter/
Le problème avec cette question, c'est que "l'ouverture" de l'application n'est pas bien défini. Une application est soit froid lancé à partir d'un état non exécuté, ou la réactivation d'un état inactif (par exemple, de passage à partir d'une autre application). Voici ma solution pour distinguer tous ces états possibles:
Et
MXDefaults
est juste un petit wrapper pourNSUserDefaults
.Pour
swift
Xcode 10 Swift 4.2
Pour Les Clients De Swift:
Si vous souhaitez vous lancer sur une page différente de l'ouverture de pousser ou quelque chose comme ça, vous devez vérifier dans
didFinishLaunchingWithOptions
comme:DANS SWIFT:
Je suis en cours d'exécution des Notifications Push (avec arrière-plan de l'extraction). Lorsque mon application est en arrière-plan, et je reçois une notification push, j'ai trouvé que didReceiveRemoteNotification dans appDelegate serait appelé deux fois; une fois pour lors de la réception de la notification et de l'autre lorsque l'utilisateur clique sur la notification d'alerte.
Pour détecter si la notification d'alerte a été cliqué, il suffit de vérifier si applicationState valeur brute == 1 à l'intérieur didReceiveRemoteNotification dans appDelegate.
J'espère que cette aide.
Lorsque l'application est en arrière-plan comme shanegao vous pouvez utiliser
Mais si vous voulez lancer l'application et lorsque l'application est fermée et que vous souhaitez déboguer votre application, vous pouvez aller à Modifier le Schéma et dans le menu de gauche sélectionnez Exécuter puis de lancer sélectionnez Attendre pour le fichier exécutable à être lancé et puis vous lancement de l'application lorsque vous cliquez sur la notification push
Modifier le Schéma > Exécuter > Attendre pour le fichier exécutable à être lancé
Swift 3.0
Dans AppDelegate, dans la fonction 'didFinishLaunchingWithOptions' poignée de notification à distance avec un peu de retard et ouvrez votre Viewcontroller. Vous pouvez utiliser de retard à la poignée de notification après le chargement d'application avec succès.