2 votes

IOS déclenche une action de notification lorsque l'application est en arrière-plan

Mon application fait ce qui suit lorsqu'elle est ouverte à partir d'une notification à distance. En gros, elle enregistre article_id en UserDefaults afin que je puisse l'utiliser au lancement de l'application :

extension AppDelegate: UNUserNotificationCenterDelegate {

    func userNotificationCenter(
        _ center: UNUserNotificationCenter,
        didReceive response: UNNotificationResponse,
        withCompletionHandler completionHandler: @escaping () -> Void
    ) {
        let userInfo = response.notification.request.content.userInfo

        if let aps = userInfo["aps"] as? [String: AnyObject] {

            let article_id = aps["article_id"]
            UserDefaults.standard.set(article_id, forKey: "notification_article_id")
        }

        completionHandler()
    }
}

Cependant, cela ne fonctionne que si l'application est complètement fermée. Si l'application reste en arrière-plan et que l'utilisateur clique sur la notification (par exemple à partir de l'écran de verrouillage), la fonction ci-dessus ne sera pas déclenchée. Par conséquent, elle n'enregistrera pas les données dans mon fichier UserDefaults . Quelqu'un sait-il comment déclencher une action similaire dans cette situation ? Merci d'avance !

0voto

lakehousetech Points 453

La déclaration de la fonction déléguée de votre extension est correcte et devrait se déclencher dans l'état que vous avez décrit (écran de verrouillage, écran d'accueil, application en arrière-plan). Veuillez vous assurer que vous avez défini le délégué :

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

  UNUserNotificationCenter.current().delegate = self

}

Si ce paramètre est déjà défini, je vérifierais que votre code d'analyse est correct et je le testerais sur le simulateur ou sur un autre appareil. J'utilise souvent xcrun simctl pour tester les notifications push dans le simulateur. Vous pouvez le faire en créant un fichier de test fictif appelé 'payload.json', et en exécutant la commande suivante dans le terminal :

xcrun simctl push booted com.yourapp.bundle.id payload.json

Voici un exemple de payload.json :

{
    "Simulator Target Bundle": "com.yourapp.bundle.id",
    "aps":{
        "alert":{
            "title":"Egon Spengler",
            "body":"I collect spores, molds, and fungus"
        },
        "sound":"alert.caf",
        "badge":3
    },
    "alert":{
        "alertUuid":"asdfasdfasdfasdfasdf",
        "state":1,
        "lastUpdate":"2020-11-8T21:43:57+0000"
    }
}

Si l'application a été interrompue, vous pouvez obtenir le contenu de la notification au moment du lancement en utilisant le code suivant à l'intérieur de didFinishLaunchingWithOptions :

 let notificationOption = launchOptions?[.remoteNotification]
 if let notification = notificationOption as? [String: AnyObject] {

 } 

Enfin, assurez-vous que vous avez activé le mode d'arrière-plan "Notifications à distance" dans les paramètres de votre projet :

Background Modes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X