[SWIFT3] Accusé de réception d'une notification

Bonjour tout le monde ^^


 


J'ai récemment mis en place les notifications sur mon application, je peux en envoyer via php et pas de soucis, tout fonctionne bien.


 


Depuis hier, je me prends la tête pour savoir si une notification push est reçue par le téléphone ou pas..


 


Je peux savoir quand quelqu'un clic dessus mais si la personne ne clic pas dessus et préfère ouvrir l'application, ça ne fonctionne pas..


J'ai l'impression de passé à  côté de quelque chose.


 


Est-ce-qu'il y a pas une fonction toute simple qui peut me dire si une notification vient d'être reçue par l'application ?


 


Merci de votre aide :)


Mots clés:

Réponses

  • Il y a différentes méthodes qui seront appelées en fonction de l'état de l'application: les didReceiveRemoteNotification: didFinishLaunchingWithOptions: etc.


    Garde juste en mémoire une sorte d'ID dans ces cas. Et à  l'ouverture regarde cette liste.



    Une autre solution est d'utiliser uniquement des Silents Notifications, de les garde, et de les afficher toi-même en local si nécessaire. Tu garderas la liste.


  • InsouInsou Membre
    décembre 2016 modifié #3

    Oui c'est ce que j'ai cru comprendre, pourtant ça ne fonctionne pas :/


     


    Dans mon AppDelegate.swift, je me retrouve avec ça :



    import UIKit
    import UserNotifications

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    ...

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Check if launched from notification
    if let notification = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: AnyObject] {
    //print(notification)
    window?.rootViewController?.present(ViewController(), animated: true, completion: nil)
    }
    else{
    //print("ici ?")
    registerForRemoteNotification()
    }

    return true
    }

    ...

    //Called when a notification is delivered to a foreground app.
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert, .badge, .sound])
    }

    //Called to let your app know which action was selected by the user for a given notification.
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    completionHandler()
    }

    ...

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {

    print("la ?")

    switch((application.applicationState)){

    case UIApplicationState.inactive:
    print("Inactive")
    //Show the view with the content of the push
    completionHandler(.newData)

    case UIApplicationState.background:
    print("Background")
    //Refresh the local model
    completionHandler(.newData)

    default:
    print("Active")
    //Show an in-app banner
    completionHandler(.newData)
    break
    }
    }

    }

    Le soucis, c'est que je ne passe jamais dans didReceiveRemoteNotification :/


    Le "print" (en rouge) n'est jamais affiché..


     


    J'ai d'ailleurs une erreur sur cette ligne :


     


    Instance method 'application(application:didReceiveRemoteNotification:fetchCompletionHandler:)' nearly matches optional requirement 'application(_:didReceiveRemoteNotification:fetchCompletionHandler:)' of protocol 'UIApplicationDelegate'

     


    Mais je ne la comprend pas trop :/


    Une idée de ce qui peut coincer ?


  • LarmeLarme Membre
    décembre 2016 modifié #4

    Oui, Swift 3 qui a changé les signatures de ses méthodes


    Tu verras que tes méthodes Swift 3 ont souvent après l'ouverture de la parenthèse un underscore.


    Alors que celle de ton implémentation non. Donc c'est normal qu'elle ne soit pas appelée.


     


    C'est exactement ce qu'on t'a déjà  dit précédemment : http://forum.cocoacafe.fr/topic/14849-swift-3-erreur-de-code/?p=143130


  • A vrai dire, c'est juste une erreur de code dans mon post, dans mon code, l'underscore y est bien ^^


    J'ai juste fait tellement de test que j'ai pas copier/coller le bon :/


     


    Ceci dit, avec l'underscore, ça fonctionne pas non plus, je ne passe jamais dedans..


     


    Pour info, je lance l'appli, j'envois une notification depuis php, lors de la réception, je devrais au moins passer dans mon print (en rouge) .. nan ? C'est bien le principe attendu où j'ai loupé un truc ?


  • colas_colas_ Membre
    décembre 2016 modifié #6

    Hello Insou,


    peut-être que ça t'aidera. Depuis iOS 10, une application foreground peut afficher les notifications !


    Voilà  le code



    // NOTIFICATION DELEGATE (≥ iOS 10)

    - (void)userNotificationCenter:(UNUserNotificationCenter *)center
    willPresentNotification:(UNNotification *)notification
    withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
    {
    completionHandler(UNNotificationPresentationOptionAlert);
    }


    C'est géré par un delegate (je te laisse googleiser pour trouver lequel)


  • Colas : C'est pas déjà  ce que j'utilise ?


    Regarde mon code plus haut, j'ai l'impression que c'est le même truc ^^


     


    Puis mon soucis n'est pas pour afficher la notification mais pour détecter qu'elle à  bien été reçue sur le téléphone..


  • Euh, non pas du tout ! 


    C'est une méthode de UNUserNotificationCenterDelegate


    Je pense qu'il faut que tu essaies avec ce delegate-là .


     


    Sinon, j'ai l'impression qu'il y a une erreur de logique dans code (mais corrigez-moi si je me trompe) : comment le code pourrait être exécuté si l'application est background ?




  • Euh, non pas du tout ! 


    C'est une méthode de UNUserNotificationCenterDelegate


    Je pense qu'il faut que tu essaies avec ce delegate-là .


     


    Sinon, j'ai l'impression qu'il y a une erreur de logique dans code (mais corrigez-moi si je me trompe) : comment le code pourrait être exécuté si l'application est background ?




     


    Bah... pour moi j'utilise bien UNUserNotificationCenterDelegate nan ?


    il est bien dans mes classes appelées au début..


    Mais peut-être que j'ai mal compris comment l'utiliser ? Pour le coup là  j'suis un peu perdu..


     


    Pour la logique du code.. pour moi, le serveur Push envoi la notification, qui réveille le téléphone et qui associe la notification à  la bonne application, ensuite quand tu clic dessus, ça te dit si l'application était lancée ou pas, tout simplement.. mais peut-être que je dis n'importe quoi..


    Du coup si quelqu'un peut nous éclairer sur ça, c'est pas de refus non plus :p

  • Oui tu as raison.

    Je n'avais pas bien lu.
  • Bah pour le coup, j'aurai préféré m'être trompé parce que j'ai pas plus d'infos sur le pourquoi ça ne fonctionne pas  xd


  • InsouInsou Membre
    décembre 2016 modifié #12

    Alors du coup, j'arrive à  passer dans didReceiveRemoteNotification


     


    Il suffisait de supprimer cette fonction dans mon code : 



    //Called to let your app know which action was selected by the user for a given notification.
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    completionHandler()
    }

    Je passe bien dans la fonction mais ça ne me fait pas pour autant un vrai accusé de réception..


    Maintenant que je passe dedans, je peux voir si la personne l'a ouvert depuis la notification, ce qui bascule l'état en "Lu"


    Mais si la personne supprime la notification ou ne l'a reçoit pas, je n'ai rien qui me le dit :/


Connectez-vous ou Inscrivez-vous pour répondre.