didReceiveRemoteNotification wird in iOS 13.3 nicht aufgerufen, wenn sich die App im Hintergrund befindet

10

Ich schlage meinen Kopf. Ich implementiere eine Push-Benachrichtigung. Alles funktioniert einwandfrei (Push wird empfangen, Badge wird aktualisiert), aber unter iOS 13.3 wird die Methodenanwendung (_: didReceiveRemoteNotification: fetchCompletionHandler :) nicht aufgerufen, wenn sich die App im Hintergrund befindet. Wenn sich die App im Vordergrund befindet oder ein iOS 12-Gerät verwendet, wird die Methode aufgerufen. Ich registriere mich wie folgt für die Push-Benachrichtigung:

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

Die Nutzlast ist wie folgt eingestellt

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

Ich habe versucht, "Remote-Benachrichtigungen" und "Hintergrundverarbeitung" als App-Funktionen in allen Varianten hinzuzufügen (nur "Remote-Benachrichtigungen" / "Hintergrundverarbeitung", ohne eine dieser Funktionen, die beide aktivieren), ohne Änderungen vorzunehmen. Ich habe den Delegaten für das UNUserNotificationCenter festgelegt, aber wieder ohne Erfolg. Ich setze die Header entsprechend:

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

Aus den Dokumenten geht hervor, dass diese Methode auch dann aufgerufen wird, wenn sich die App im Hintergrund befindet:

Verwenden Sie diese Methode, um eingehende Remote-Benachrichtigungen für Ihre App zu verarbeiten. Im Gegensatz zur Methode application: didReceiveRemoteNotification:, die nur aufgerufen wird, wenn Ihre App im Vordergrund ausgeführt wird, ruft das System diese Methode auf, wenn Ihre App im Vordergrund oder Hintergrund ausgeführt wird.

Was fehlt mir hier für iOS 13?

MartinW1985
quelle
Überprüfen Sie, ob Sie diese Methode verwenden: developer.apple.com/documentation/uikit/uiapplicationdelegate/…
1
Siehe oben: Alles funktioniert einwandfrei (Push wird empfangen, Badge wird aktualisiert), aber unter iOS 13.3 wird die Methodenanwendung (_: didReceiveRemoteNotification: fetchCompletionHandler :) nicht aufgerufen, wenn sich die App im Hintergrund befindet.
MartinW1985
application (_: didReceiveRemoteNotification: fetchCompletionHandler :) wird aufgerufen, wenn Sie auf das Benachrichtigungsbanner tippen
Ja das ist korrekt. Meine Frage ist: Warum wird es nicht aufgerufen, wenn sich die App im Hintergrund befindet? Nach meinem Verständnis sagen die Dokumente dies.
MartinW1985
Haben Sie versucht, application(_:didReceiveRemoteNotification:withCompletionHandler:)Methode zu implementieren ?
HardikS

Antworten:

2

Hast du eingestellt

"content-available": 1

in Ihrem Backend APS Nutzlast?

Stellen Sie außerdem sicher, dass Sie den Hintergrundmodus in der info.plist-Datei Ihrer iOS-App aktiviert haben

<key>UIBackgroundModes</key>
<array>
    <string>processing</string>
    <string>remote-notification</string>
</array>
Zhang Zhan
quelle
@matt Der Beitrag wurde versehentlich gesendet, bevor ich alle Antworten eingebe. Jetzt ist es mit App-Seitenwechsel abgeschlossen.
Zhang Zhan
1
Ja, habe ich. Sie können aus meiner CURL-Anfrage in meinem ersten Beitrag sehen. Ich habe auch "content-available" hinzugefügt: 1 und alle Hintergrundmodi (aktiviert, deaktiviert, Variationen) ausprobiert, aber die Anwendung (_: didReceiveRemoteNotification: fetchCompletionHandler :) wird nicht aufgerufen. Nur wenn die App aktiv ist.
MartinW1985
<string> Verarbeitung </ string> => Dies ist eine wichtige Zeile
Dong Mai
@ ZhangZhan: Hast du dieses Problem jemals gelöst? Ich habe das gleiche Problem, bei dem keine stillen / Hintergrundbenachrichtigungen empfangen werden, selbst wenn der inhaltsverfügbare Schlüssel richtig eingestellt ist. Unter iOS 12 funktioniert alles ordnungsgemäß, aber unter iOS13 funktionieren nur die akustischen / visuellen Benachrichtigungen. Mir ist bekannt, dass Apple einen neuen Headertyp benötigt, um in die Benachrichtigung aufgenommen zu werden, aber das wird bereits behandelt (wir verwenden SNS). Interessanterweise funktioniert dies im Simulator mit der Apns-Datei mit der neuesten XCode-Version nicht.
Whawhat
2

Ich gebe ein Support-Ticket aus, um eine Antwort auf dieses Problem zu erhalten.

Es stellt sich heraus, dass die Dokumentation für iOS 13 zu diesem Thema nicht 100% "gültig" ist. Das Gerät entscheidet, ob es aufwacht oder nicht. Obwohl die Dokumentation etwas anders angibt.

Apples bevorzugte Implementierungsmethode als Benachrichtigungserweiterung. Danach müssen Sie die Nutzdaten anpassen, um "veränderlichen Inhalt" einzuschließen.

Ich fragte den Support danach, ob ich ein Radar einreichen sollte und sie antworteten mit "Ja".

MartinW1985
quelle
Wenn Sie eine Benachrichtigungserweiterung angeben, wird die App dann aktiviert?
Peter Lapisu
0

Implementieren Sie didRegisterForRemoteNotificationsWithDeviceTokenund auch didFailToRegisterForRemoteNotificationsWithErrorim Delegaten Ihrer App, um zu überprüfen, ob das Gerät eine gute Verbindung zum APN-Server von Apple herstellt. Ist dies nicht der Fall, starten Sie das Gerät neu und / oder versuchen Sie, eine Verbindung über ein anderes Wi-Fi-Netzwerk herzustellen und die App neu zu starten.

Ely
quelle
0

Diese Delegatenmethode: -

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

wird aufgerufen, wenn wir auf Benachrichtigung für iOS 13 klicken und die App im Hintergrund ist.

user13150044
quelle
1
Ja, aber ich habe nach einer Möglichkeit gesucht, die Nutzdaten abzurufen, ohne auf die Benachrichtigung zu klicken.
MartinW1985
0

Sie müssen eine Benachrichtigungsinhaltserweiterung implementieren

Da ich OneSignal und dessen Setup-Code verwendet habe, hat dies für mich unter https://documentation.onesignal.com/docs/ios-sdk-setup einwandfrei funktioniert

Ich bin mir nicht sicher, ob die OneSignal-Bits einen Unterschied machen, aber ich füge sie trotzdem hinzu

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
quelle