Il y a beaucoup de threads stackoverflow concernant ce sujet, mais je n'ai toujours pas trouvé de bonne solution.
Si l'application n'est pas en arrière - plan, je peux vérifier launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]
en application:didFinishLaunchingWithOptions:
appel pour voir si elle est ouverte à partir d' une notification.
Si l'application est en arrière-plan, tous les articles suggèrent d'utiliser application:didReceiveRemoteNotification:
et de vérifier l'état de l'application. Mais comme j'ai expérimenté (et aussi comme le nom de cette API le suggère), cette méthode est appelée lorsque la notification est reçue, au lieu d'être tapée.
Le problème est donc que si l'application est lancée puis mise en arrière-plan et que vous savez qu'une notification est reçue de application:didReceiveNotification
( application:didFinishLaunchWithOptions:
ne se déclenchera pas à ce stade), comment savoir si l'utilisateur a repris l'application à partir de en appuyant sur la notification ou en appuyant simplement sur le icône de l'application? Parce que si l'utilisateur a tapé sur la notification, l'attente est d'ouvrir la page mentionnée dans cette notification. Sinon, ça ne devrait pas.
Je pourrais utiliser handleActionWithIdentifier
pour les notifications d'action personnalisées, mais cela ne se déclenche que lorsqu'un bouton d'action personnalisé est appuyé, pas lorsque l'utilisateur appuie sur le corps principal de la notification.
Merci.
ÉDITER:
après avoir lu une réponse ci-dessous, je me suis dit que je pouvais clarifier ma question:
Comment différencier ces 2 scénarios:
(A) 1.app passe à l'arrière-plan; 2. notification reçue; 3. l'utilisateur appuie sur la notification; 4. l'application entre au premier plan
(B) 1.app passe à l'arrière-plan; 2. notification reçue; 3. l'utilisateur ignore la notification et appuie sur l'icône de l'application plus tard; 4. l'application entre au premier plan
Depuis application:didReceiveRemoteNotification:
est déclenché dans les deux cas à l'étape 2.
Ou, devrait-il application:didReceiveRemoteNotification:
être déclenché à l'étape 3 pour (A) uniquement, mais j'ai en quelque sorte mal configuré mon application, donc je la vois à l'étape 2?
Réponses:
OK, j'ai finalement compris.
Dans les paramètres cibles ➝ onglet Capacités ➝ Modes d'arrière-plan, si vous cochez "Notifications à distance",
application:didReceiveRemoteNotification:
se déclenchera dès que la notification arrivera (tant que l'application est en arrière-plan), et dans ce cas, il n'y a aucun moyen de dire si l'utilisateur tapera sur la notification.Si vous décochez cette case,
application:didReceiveRemoteNotification:
ne sera déclenché que lorsque vous appuyez sur la notification.C'est un peu étrange que cocher cette case modifie le comportement de l'une des méthodes de délégué d'application. Ce serait plus agréable si cette case est cochée, Apple utilise deux méthodes de délégué différentes pour la réception des notifications et le robinet de notification. Je pense que la plupart des développeurs veulent toujours savoir si une notification est activée ou non.
Espérons que cela sera utile pour quiconque rencontre ce problème. Apple ne l'a pas non plus clairement documenté ici , il m'a donc fallu un certain temps pour comprendre.
la source
J'ai cherché la même chose que vous et j'ai trouvé une solution qui ne nécessite pas de cocher la notification à distance.
Pour vérifier si l'utilisateur a tapé, ou si l'application est en arrière-plan ou est active, il vous suffit de vérifier l'état de l'application dans
Pour plus d'informations, consultez:
Référence UIKit Framework> Référence de classe UIApplication> UIApplicationState
la source
content-available
clé, mais la notification doit alors être silencieuse (c'est-à-dire ne pas inclure de son ou de badge) comme indiqué dans la documentation officielle. .func applicationDidEnterBackground(_ application: UIApplication)
et false dans le,func applicationDidBecomeActive(_ application: UIApplication)
cela m'a permis d'afficher l'application dans l'application notifications lorsque l'application est inactive en raison du centre de contrôle ou de la liste des notificationsSelon iOS / XCode: comment savoir que l'application a été lancée en cliquant sur la notification ou sur l'icône de l'application Springboard? vous devez vérifier l'état de l'application dans didReceiveLocalNotification comme ceci:
Bien que cela ne me semble pas totalement logique, cela semble fonctionner.
la source
Si quelqu'un le veut dans Swift 3.0
pour swift 4
la source
Si vous avez coché "Modes d'arrière-plan"> "Notifications à distance" == OUI, appuyez sur l'événement de notification arrivera dans:
Ça m'a aidé. Amusez-vous :)
la source
J'ai également rencontré ce problème - mais sur iOS 11 avec le nouveau
UserNotifications
Framework.Ici pour moi c'est comme ça:
application:didFinishLaunchingWithOptions:
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
userNotificationCenter(_:willPresent:withCompletionHandler:)
userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:
la source
Dans mon cas, le mode de fond OFF ne faisait aucune différence. Cependant, lorsque l'application a été suspendue et que l'utilisateur a appuyé sur la notification, je pouvais gérer le cas dans cette méthode de rappel:
la source
Pour iOS 10 et supérieur, mettez ceci dans AppDelegate, pour savoir que la notification est activée (fonctionne même si l'application est fermée ou ouverte)
la source
Il existe deux fonctions pour gérer la notification PushNotification reçue à l'intérieur de la
PushNotificationManager
classe:Comme j'ai testé le premier déclencheur dès l'arrivée de la notification
Et le deuxième lorsque vous appuyez sur la notification:
Je l'ai également testé avec les états ON et OFF de la notification à distance (en arrière-plan)
la source
SWIFT 5.1
UIApplication.State
n'a pas fonctionné pour moi, car une fois que j'ai lu l'empreinte digitale (modale est affichée) dans mon application, une notification est également lancée dans la barre supérieure et l'utilisateur doit cliquer dessus.J'ai créé
public static var isNotificationFromApp: Bool = false
dans
AppDelegate
et je l'ai mistrue
dans mon démarrageviewController
puis dans ma notificationstoryboard
/viewController
je viens de le vérifier :)J'espère que cela peut être utile
la source
Vous pouvez configurer la charge utile de votre notification push pour appeler le délégué d'application
application:didReceiveRemoteNotification:fetchCompletionHandler:
méthode lorsque l'application est en arrière-plan. Vous pouvez définir un indicateur ici afin que lorsque l'utilisateur lancera votre application la prochaine fois, vous puissiez effectuer votre opération.À partir de la documentation d'Apple, vous devez utiliser ces méthodes pour télécharger le nouveau contenu associé à la notification push. Pour que cela fonctionne également, vous devez activer la notification à distance à partir des modes d'arrière-plan et votre charge utile de notification push doit contenir une
content-available
clé avec sa valeur définie sur 1. Pour plus d'informations, veuillez consulter la section Utilisation des notifications push pour lancer une section de téléchargement d'Apple doc ici .Une autre façon consiste à avoir le nombre de badges dans la charge utile des notifications push. Ainsi, la prochaine fois que votre application sera lancée, vous pourrez vérifier le nombre de badges d'application. S'il est supérieur à zéro, effectuez également votre opération et supprimez / effacez le nombre de badges du serveur.
J'espère que cela vous aide.
la source