[SWIFT] Notification Push / Clic sur une notification et données reçues

InsouInsou Membre

Bonjour tout le monde,

J'ai dû réouvrir un ancien projet pour remettre à jour une fonctionnalité et je galère un peu avec les données envoyées (via php) et reçues (via l'appli).

En gros, lors du clic sur une notification, je veux récupérer un id pour m'en servir plus loin.. sauf que je ne le retrouve pas ou je m'y prends pas mal..

Côté php, ça se présente comme ça :

$messageBody['aps'] = array('alert' => array("loc-key"=>"Label_VousEtesDestinataireDunMessage","loc-args"=>"Label_MerciDenPrendreConnaissance"), "mutable-content"=>1, 'sound' => "monSon",'badge' => 20,'IdSociete' => 10);
$payload = json_encode($messageBody);
$msg = chr(0).pack('n', 32).pack('H*', LeTokenDeMonUtilisateur).pack('n',strlen($payload)).$payload;

La valeur que je veux récupérer est : IdSociete

Côté Swift, j'ai ça :

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("Clic notification ?")
print(response) // ici ?
}

J'ai fouillé dans mon response et je n'arrive pas à retrouver mon IdSociete..

Est-ce-que je m'y prend mal ?

Réponses

  • LarmeLarme Membre
    mars 2019 modifié #2

    response.notification.request.content.zzz où "zzz" est userInfo ou body, je ne sais pas par contre?

  • InsouInsou Membre

    rhaa ptin, c'était bien dans userInfo..
    Merci Larme :)

  • InsouInsou Membre

    Suivant certains type de notifications, j'aimerai rediriger mon utilisateur sur la bonne view...

    Mon application est sous cette forme :

    |- Accueil 
        |- Messagerie
        |- Incidents
        |- Paramètres
    

    Sur mon storyboard, j'ai différent segues qui vont vers les bonnes vues..
    Lorsque je clic sur mon menu, les segues fonctionnent bien, pas de soucis.

    Maintenant, lorsque je reçois une notification de type "Message", j'aimerai ouvrir directement ma view "Messagerie" via mon segue..

    J'ai essayé de mettre ça dans AppDelegate mais ça plante en me disant que le segue n'existe pas (pourtant il existe bien)

    // lorsqu'on clic sur une notification push
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        if let notification = response.notification.request.content.userInfo["aps"] as? NSDictionary {
            if let segueRedirection = notification["segueRedirection"] as? String {
                 AccueilViewController().performSegue(withIdentifier: segueRedirection, sender: nil)
            }
        }
    }
    

    J'ai l'impression que je suis "trop tôt" et qu'il ne connait pas encore les segues du storyboard..
    J'ai bon ?

    Comment palier à ce problème ? :/

  • LarmeLarme Membre

    AccueilViewController(), à moins que tu aies overrider l'init, c'est créer un TOUT nouvel objet. Il faudrait que tu saches ça depuis le temps.
    Cela ne l'init pas avec le Storyboard/Xib, donc pas de segue.

  • InsouInsou Membre

    Je comprends bien que mon AccueilViewController() est foireux et ne s'utilise pas comme ça mais du coup, comment faire pour que mon segue soit pris en compte ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Pour accéder les ViewControllers, il faut les addresser par la Window :

      func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
      {
        guard let notification = response.notification.request.content.userInfo["aps"] as? [String : String],
              let segueRedirection = notification["segueRedirection"],
              let rootViewController = window?.rootViewController,
              let acceuilViewController = rootViewController as? AccueilViewController else
        {
          return
        }
    
        acceuilViewController.performSegue(withIdentifier: segueRedirection, sender: acceuilViewController)
      }
    
  • InsouInsou Membre

    @Joanna J'ai testé ton code mais ça foire quelque part..

    Après plusieurs tests, ça foire sur let acceuilViewController = rootViewController as? AccueilViewController
    Je ne sais pas pourquoi pour le coup..
    Il n'y a aucune erreur, je passe juste dans le else

    Je vais continuer de chercher ou peut-être déplacer ce déclenchement de segue dans un autre endroit de l'appli où ça pourrait le faire..

  • LarmeLarme Membre

    Print rootViewController alors (ou regarde quelle est sa classe).
    On ne peut pas deviner quelle est sa classe. Après, il y a 4 tests dans le guard, c'est vraiment celui-là qui rate ?
    Si rootViewController est de classe AnotherCustomViewController, c'est normal, le cast foire.

  • Print rootViewController alors (ou regarde quelle est sa classe).

    Optional(<UINavigationController: 0x144815a00>)

    Après, il y a 4 tests dans le guard, c'est vraiment celui-là qui rate ?

    Oui car j'ai enlever les autres tests pour être sur que ce soit lui qui foire..

    if let notification = response.notification.request.content.userInfo["aps"] as? NSDictionary {
            print("IF OK")
            let rootViewController = window?.rootViewController
            print(rootViewController)
            if let segueRedirection = notification["segue"] {
                print(segueRedirection)
                guard let acceuilViewController = rootViewController as? AccueilViewController else
                {
                    print("PAS OK")
                    return
                }
                print("OK AVANT REDIRECTION")
    
                acceuilViewController.performSegue(withIdentifier: segueRedirection as! String, sender: acceuilViewController)
            }
        }
    

    Je passe dans le "PAS OK" :/

  • Joanna CarterJoanna Carter Membre, Modérateur

    Dans ce cas là, tu as un navigation controller et il faut trouver le premier view controller pour y arriver :

        guard let notification = response.notification.request.content.userInfo["aps"] as? [String : String],
              let segueRedirection = notification["segueRedirection"],
              let rootViewController = window?.rootViewController,
              let navigationViewController = rootViewController as? UINavigationController,
              let acceuilViewController = navigationViewController.viewControllers.first as? AccueilViewController else
        {
          return
        }
    
        acceuilViewController.performSegue(withIdentifier: segueRedirection, sender: acceuilViewController)
    
  • Merci Joanna ^^

    Maintenant que je vois le code écrit, ça parait évident et j'me sens bête mais bon.. c'est aussi comme ça qu'on apprend ^^

    Du coup, je pense avoir résolu mon soucis.
    J'ai du remanier pas mal de trucs dans l'appli car évidement, j'arrivais toujours pas sur mon AccueilViewController
    Mais ça m'a permis de mettre en évidence quelques trucs qui ne servait plus vraiment.dans mon code ^^

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