didReceiveRemoteNotification non appelé dans iOS 13.3 lorsque l'application est en arrière-plan

10

Je me tape la tête. J'implémente la notification push. Tout fonctionne bien (push est reçu, le badge est mis à jour) mais sous iOS 13.3 l'application de méthode (_: didReceiveRemoteNotification: fetchCompletionHandler :) n'est pas appelée lorsque l'application est en arrière-plan. Si l'application est au premier plan ou utilise un appareil iOS 12, la méthode est appelée. Je m'inscris pour la notification push de la manière suivante:

[[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    if (granted) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        });
    }
}];

La charge utile est définie comme suit

{"aps": {
    "badge": 10,
    "alert": "test",
    "content-available": 1
}}

J'ai essayé d'ajouter "Notifications à distance" et "Traitement en arrière-plan" comme capacités d'application dans toutes les variantes (uniquement "Notifications à distance" / "Traitement en arrière-plan", sans aucune de ces capacités, permettant les deux) sans aucune modification. J'ai placé le délégué pour l'UNUserNotificationCenter mais encore une fois sans succès. J'ai défini les en-têtes en conséquence:

curl -v \
 -H 'apns-priority: 4' \
 -H 'apns-topic: xx.xxxxx.xxxx' \
 -H 'apns-push-type: alert' \
 -H 'Content-Type: application/json; charset=utf-8' \
 -d '{"aps": {"badge": 10,"alert": "test", "content-available":1}}' \
 --http2 \
 --cert pushcert.pem \
 https://api.sandbox.push.apple.com/3/device/1234567890

D'après les documents, il indique que cette méthode est appelée même lorsque l'application est en arrière-plan:

Utilisez cette méthode pour traiter les notifications distantes entrantes pour votre application. Contrairement à la méthode application: didReceiveRemoteNotification:, qui est appelée uniquement lorsque votre application s'exécute au premier plan, le système appelle cette méthode lorsque votre application s'exécute au premier plan ou en arrière-plan.

Qu'est-ce que je manque ici pour iOS 13?

MartinW1985
la source
Vérifiez si vous utilisez cette méthode: developer.apple.com/documentation/uikit/uiapplicationdelegate/…
1
Veuillez voir ci-dessus: Tout fonctionne bien (push est reçu, le badge est mis à jour) mais sous iOS 13.3, l'application de méthode (_: didReceiveRemoteNotification: fetchCompletionHandler :) n'est pas appelée lorsque l'application est en arrière-plan.
MartinW1985
l'application (_: didReceiveRemoteNotification: fetchCompletionHandler :) sera appelée lorsque vous appuyez sur la bannière de notification
Oui, c'est correct. Ma question est la suivante: pourquoi n'est-elle pas appelée lorsque l'application est en arrière-plan. D'après ma compréhension, les documents le disent.
MartinW1985
Avez-vous essayé en implémentant la application(_:didReceiveRemoteNotification:withCompletionHandler:)méthode?
HardikS

Réponses:

2

Avez-vous défini

"content-available": 1

en vous la charge utile APS backend?

Vous devez également vous assurer que vous avez activé le mode d'arrière-plan dans le fichier info.plist de votre application iOS

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
Zhang Zhan
la source
@matt le message a été soumis accidentellement avant que je tape toutes les réponses. Maintenant, il est complété par un changement de côté de l'application.
Zhang Zhan
1
Oui je l'ai fait. Vous pouvez voir de ma demande CURL dans mon post initial. J'ai également ajouté "content-available": 1 et essayé tous les modes d'arrière-plan (activés, désactivés, variantes) mais toujours l'application (_: didReceiveRemoteNotification: fetchCompletionHandler :) n'est pas appelée. Uniquement si l'application est active.
MartinW1985
<string> traitement </string> => ceci est une ligne importante
Dong Mai
@ZhangZhan: Avez-vous déjà résolu ce problème? Je rencontre le même problème où les notifications silencieuses / d'arrière-plan ne sont pas reçues même lorsque la clé de contenu disponible est définie correctement. Sur iOS 12, tout fonctionne correctement mais sur iOS13, seules les notifications sonores / visuelles fonctionnent. Je suis conscient qu'Apple nécessite un nouveau type d'en-tête pour être inclus dans la notification mais qui est déjà géré (nous utilisons SNS). Fait intéressant, cela ne fonctionne pas dans le simulateur avec le fichier apns avec la dernière version de XCode.
quel
2

Je dépense un ticket d'assistance pour obtenir une réponse à ce problème.

Il s'avère que la documentation n'est pas 100% "valide" pour iOS 13 sur ce sujet. L'appareil décide de se réveiller ou non. Bien que la documentation indique un peu différent.

Mode de mise en œuvre préféré d'Apple en tant qu'extension de notification. Après cela, vous devez adapter la charge utile pour inclure le "contenu mutable".

J'ai ensuite demandé au support si je devais déposer un radar et ils ont répondu "oui".

MartinW1985
la source
si vous fournissez une extension de notification, l'application est-elle réveillée?
Peter Lapisu
0

Implémentez didRegisterForRemoteNotificationsWithDeviceTokenet également didFailToRegisterForRemoteNotificationsWithErrordans le délégué de votre application, pour vérifier si l'appareil établit une bonne connexion avec le serveur APN d'Apple. Si ce n'est pas le cas, redémarrez l'appareil et / ou essayez d'établir une connexion via un autre réseau Wi-Fi et redémarrez l'application.

Ely
la source
0

Cette méthode déléguée: -

(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler

est invoqué lorsque nous cliquons sur la notification pour iOS 13 et que l'application est en arrière-plan.

user13150044
la source
1
Oui, mais je cherchais un moyen d'obtenir la charge utile sans cliquer sur la notification.
MartinW1985
0

Vous devez implémenter une extension de contenu de notification

Comme j'utilisais OneSignal et son code de configuration, cela a bien fonctionné pour moi https://documentation.onesignal.com/docs/ios-sdk-setup

Je ne sais pas si les bits OneSignal font une différence, mais en les ajoutant quand même

import UserNotifications
import OneSignal

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var receivedRequest: UNNotificationRequest!
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.receivedRequest = request;
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
            OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
            contentHandler(bestAttemptContent)
        }
    }

}
Peter Lapisu
la source