didReceiveRemoteNotification non chiamato in iOS 13.3 quando l'app è in background


10

Sto sbattendo la testa. Sto implementando la notifica push. Tutto funziona correttamente (push ricevuto, badge aggiornato) ma in iOS 13.3 l'applicazione del metodo (_: didReceiveRemoteNotification: fetchCompletionHandler :) non viene chiamata quando l'app è in background. Se l'app è in primo piano o utilizza un dispositivo iOS 12, viene chiamato il metodo. Mi registro per la notifica push nel modo seguente:

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

Il payload è impostato come segue

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

Ho provato ad aggiungere "Notifiche remote" e "Elaborazione in background" come funzionalità dell'app in tutte le varianti (solo "Notifiche remote" / "Elaborazione in background", senza nessuna di queste funzionalità, abilitando entrambi) senza alcuna modifica. Ho impostato il delegato per UNUserNotificationCenter ma di nuovo senza successo. Ho impostato le intestazioni di conseguenza:

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

Dai documenti si afferma che questo metodo viene chiamato anche quando l'app è in background:

Utilizza questo metodo per elaborare le notifiche remote in arrivo per la tua app. A differenza dell'applicazione: didReceiveRemoteNotification: method, che viene chiamato solo quando l'app è in esecuzione in primo piano, il sistema chiama questo metodo quando l'app è in esecuzione in primo piano o in background.

Cosa mi sto perdendo qui per iOS 13?


Verifica se stai utilizzando questo metodo: developer.apple.com/documentation/uikit/uiapplicationdelegate/…

1
Vedi sopra: tutto funziona correttamente (push ricevuto, badge aggiornato) ma in iOS 13.3 l'applicazione del metodo (_: didReceiveRemoteNotification: fetchCompletionHandler :) non viene chiamata quando l'app è in background.
MartinW1985,

application (_: didReceiveRemoteNotification: fetchCompletionHandler :) verrà chiamata quando tocchi il banner di notifica

Sì, questo è corretto. La mia domanda è: perché non viene chiamato quando l'app è in background. Secondo la mia comprensione, i documenti lo dicono.
MartinW1985,

Hai provato implementando il application(_:didReceiveRemoteNotification:withCompletionHandler:)metodo?
HardikS,

Risposte:


2

Hai impostato

"content-available": 1

nel tuo payload APS back-end?

Inoltre, devi assicurarti di aver abilitato la modalità in background nel file info.plist della tua app iOS

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>

@matt il post è stato inviato per errore prima di digitare tutte le risposte. Ora è completato con il cambio lato app.
Zhang Zhan,

1
Si l'ho fatto. Puoi vedere dalla mia richiesta CURL nel mio post iniziale. Ho anche aggiunto "content-available": 1 e ho provato tutte le modalità in background (abilitato, disabilitato, variazioni) ma ancora l'applicazione (_: didReceiveRemoteNotification: fetchCompletionHandler :) non viene chiamata. Solo se l'app è attiva.
MartinW1985

<string> processing </string> => questa è una linea importante
Dong Mai

@ZhangZhan: hai mai risolto questo problema? Sto riscontrando lo stesso problema in cui le notifiche silenziose / in background non vengono ricevute anche quando la chiave disponibile per il contenuto è impostata correttamente. Su iOS 12, tutto funziona correttamente ma su iOS13, funzionano solo le notifiche sonore / visive. Sono consapevole che Apple richiede che un nuovo tipo di intestazione sia incluso nella notifica ma che è già gestito (stiamo usando SNS). È interessante notare che questo non funziona nel simulatore con il file apns con l'ultima versione di XCode.
whawhat il

2

Spendo un ticket di supporto per ottenere una risposta a questo problema.

Si scopre che la documentazione non è "valida" al 100% per iOS 13 su questo argomento. Il dispositivo decide se svegliarsi o meno. Anche se la documentazione afferma un po 'diverso.

Il modo di implementazione preferito di Apple come estensione di notifica. Successivamente, è necessario adattare il payload per includere "contenuto modificabile".

Successivamente ho chiesto al supporto se avrei dovuto presentare un radar e loro hanno risposto "si".


se fornisci un'estensione di notifica, l'app viene svegliata?
Peter Lapisu,

0

Implementa didRegisterForRemoteNotificationsWithDeviceTokene anche didFailToRegisterForRemoteNotificationsWithErrornel delegato della tua app, per verificare se il dispositivo ha una buona connessione con il server APN di Apple. In caso contrario, riavviare il dispositivo e / o provare a stabilire una connessione tramite un'altra rete Wi-Fi e riavviare l'app.


0

Questo metodo delegato: -

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

viene invocato quando si fa clic sulla notifica per iOS 13 e l'app è in background.


1
Sì, ma stavo cercando un modo per ottenere il payload senza fare clic sulla notifica.
MartinW1985,

0

È necessario implementare un'estensione del contenuto delle notifiche

Mentre stavo usando OneSignal e il suo codice di installazione, questo ha funzionato bene per me https://documentation.onesignal.com/docs/ios-sdk-setup

non sono sicuro che i bit OneSignal facciano la differenza, ma aggiungendoli comunque

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)
        }
    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.