Détecter si la demande: didReceiveRemoteNotification: fetchCompletionHandler: a été appelé en appuyant sur une notification dans le Centre de notifications
application: didReceiveRemoteNotification: fetchCompletionHandler:
est différente de
application: didReceiveRemoteNotification:
Comment? à partir de la documentation:
Contrairement à l'application:didReceiveRemoteNotification: la méthode, qui est
appelé que lorsque votre application est en cours d'exécution, le système appelle cette méthode
quel que soit l'état de votre application. Si votre application est suspendue ou pas
en cours d'exécution, le système se réveille ou lance votre application et le met dans le
exécution en arrière-plan de l'état avant d'appeler la méthode. Si l'utilisateur ouvre
votre application dans le système affiche l'alerte, le système appelle cette méthode
à nouveau de sorte que vous savez de la notification de l'utilisateur sélectionné.
Ma lutte est: je veux savoir si la méthode a été appelée par l'utilisateur en appuyant sur un système affiche alerte dans le Centre de Notification, ou à partir d'un silencieux de notification push qui réveille l'appareil. Actuellement, aussi loin que je peux voir, il n'y a pas de moyen évident de les différencier.
- (BOOL)application: didFinishLaunchingWithOptions:
Le suivi de l' launchOptions dans la méthode ci-dessus n'est pas une solution car elle est appelée uniquement si l'application est suspendue/pas en cours d'exécution en arrière-plan. Si il fonctionne dans le fond elle n'est pas appelée.
Vous devez vous connecter pour publier un commentaire.
La Pomme docs sont un peu confus,
est utilisé que si votre application prend en charge la télécommande-la notification le mode arrière-plan (c'est à dire que vous faites BackgroundFetch.)
est appelée lorsque le système d'exploitation reçoit une RemoteNotification et que l'application est en cours d'exécution (à l'arrière-plan/suspension ou au premier plan.)
Vous pouvez vérifier la UIApplicationState pour voir si l'application a été apporté à la premier plan par l'utilisateur (en tapant sur la notification) ou est déjà en cours d'exécution lorsque la notification est en.
application: didReceiveRemoteNotification:
mais surapplication: didReceiveRemoteNotification: fetchCompletionHandler:
remote-notification
mode d'arrière-plan) >le système des appels à cette méthode, indépendamment de l'état de votre application. Les documents également état >Si l'utilisateur ouvre votre application dans le système affiche l'alerte, le système appelle cette méthode à nouveau de sorte que vous savez de la notification de l'utilisateur sélectionné. Je suppose que le suivi de la UIApplicationState serait encore applicable...let state = application.applicationState let wasInBackground = (state == .Inactive || state == .Background)
-application: didReceiveRemoteNotification:
était jamais de feu, même lorsque l'application est en cours d'exécution dans le premier plan (je n'ai obtenir bannières dans l'écran d'accueil, tout de même). Je suis passé àapplication: didReceiveRemoteNotification: fetchCompletionHandler:
et ça marche... je suis en utilisant CloudKit abonnement notifications.application(_:willFinishLaunchingWithOptions:)
ou par l'observation de l'UIApplicationDidFinishLaunching
de notification et d'accès à l'attachéuserInfo
dictionnaireVous pouvez cocher la case
UIApplication
'sapplicationState
pour distinguer les appels silencieux d'appels effectués avec l'application activement utilisés par l'utilisateur:Ou de garder votre propre drapeau sur le
delegate
'sapplicationDidEnterBackground:
.Active
=App était ouvert lorsque la notification a été reçue,Inactive
=l'Utilisateur a cliqué sur la notification,Background
=Application est en cours d'exécution en arrière-plan lorsque la notification a été reçue (content-disposition doit être vrai; ce cas est le fond de l'extraction). Notez que l'application doit être en cours d'exécution, au moins dans le fond. Si vous forcez-fermer l'application,didReceiveRemoteNotification
n'est pas appelé.L'État de l'Application n'est pas fiable parce que si vous avez du centre de contrôle ou d'Apple centre de notification sur votre application, de l'application: didReceiveRemoteNotification: fetchCompletionHandler: sera appelée et de l'état de l'application est Inactive.
Je vais avoir le même problème en essayant de répondre à un clic sur la notification, tandis que l'application est en arrière-plan et il ne semble pas être un moyen fiable pour uniquement cette identification.
Quand
application: didReceiveRemoteNotification:fetchCompletionHandler:
méthode est appelée application de l'état estUIApplicationStateInactive
si l'utilisateur appuie sur l'alerte (dans ce cas, vous souhaitez préparer une partie de l'INTERFACE utilisateur) et estUIApplicationStateBackground
lorsque l'application est en silence réveillé (dans ce cas, vous venez de charger des données).application:didReceiveRemoteNotification:fetchCompletionHandler:
et les deux ontapplication.applicationState == .active
qui est un problème.En cas de swift
Je ne suis pas sûr si je comprends votre question.
Voulez-vous faire la différence entre un silencieux de notification push fetch en arrière-plan et un bruit de notification push? Vous pouvez simplement de vérifier si la notification push dictionnaire contient le "content-disposition" clé:
[[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]
Si c'est le cas, il devrait être un silencieux pousser. Si non, il était normal de pousser.Voulez-vous savoir si l'arrière-plan fetch méthode est appelée lorsque l'application reçoit une notification et il est en suspension/ne fonctionne pas? Si oui, vous pouvez effectuer les opérations suivantes:
Mettre cela dans n'importe quelle méthode vous voulez voir si/lorsque cette méthode est appelée:
DDLogDebug(@"%@ - %@",NSStringFromSelector(_cmd),NSStringFromClass([self class]));
Cela permettra d'imprimer la classe et de la méthode dans le fichier journal.
Examinez le fichier journal après l'envoi vous-même une notification push à votre arrière-plan-fetch activé app, et voir si l'une des méthodes appelées par regarder votre fichier journal.
Si vous avez configuré votre application correctement pour fetch en arrière-plan, la méthode
application: didReceiveRemoteNotification: fetchCompletionHandler:
sera appelé, même lorsque l'application est backgrounded/pas en cours d'exécution si vous recevez une notification push (mode push ou pas).Dans iOS 10.0+ vous pouvez utiliser la méthode
pour détecter lorsque l'utilisateur appuie sur un système affiche alerte de la NotificationCenter.
Si vous implémentez la méthode ci-dessus
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
sera appelé seulement lorsqu'une notification est reçue- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler;
sera appelée lorsque l'utilisateur appuie sur la notificationPour Swift: Dans
application(_:didFinishLaunchingWithOptions:)
analyser les options de l'application. Si elles existent, vous savez que l'application a été lancée à partir d'eux en appuyant sur.Sinon, vous pouvez manipuler le robinet, et vous savez que l'application est ouverte/arrière-plan/inactif
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)