Stille Push-Benachrichtigung (Hintergrund) unter macOS Catalina (Catalyst-App) nicht empfangen

9

Derzeit implementiere ich Push-Benachrichtigungen von unserem Backend-Server in unsere App (macOS Catalina & iOS - gleiche Codebasis). Dabei verwende ich Apple Push-Benachrichtigungen und die tokenbasierte Authentifizierungsmethode (Generieren von JWT aus keyId, teamId, ... und Signieren mit dem in der Apple-Entwicklerkonsole generierten privaten Schlüssel), um Pushs an den APN-Dienst zu senden.

Das Problem, mit dem ich konfrontiert bin, ist, dass ich erfolgreich "Alarm" -Benachrichtigungen (Status 200, mit Header apns-push-type: alert) senden und auf meinem iOS- und MacOS-Gerät empfangen kann (die Push-Benachrichtigungen werden erfolgreich im Produktions- und Sandbox-Modus angezeigt), aber aus irgendeinem Grund "stumm" "Pushs (mit Header apns-push-type: background) werden nur auf meinem iOS-Gerät (iPhone) empfangen, nicht jedoch auf meinem Mac ( didReceiveRemoteNotification(...)in AppDelegatewird nie aufgerufen).

Was ich bisher gemacht habe:

  • Stellen Sie sicher, dass der APN-Anforderungsheader für den unbeaufsichtigten Push korrekt konfiguriert ist: apns-push-type: background
  • Stellen Sie sicher, dass Sie den richtigen APN-Themenheader haben: apns-topic: my.bundle.id(Dies ist anders für Sandbox / Produktion)
  • Der Prioritätsheader "semi-required" wurde hinzugefügt: apns-priority: 5(nur bei Übermittlung von Hintergrund-Pushs)
  • Verifiziert, dass das erstellte JWT gültig ist und im APN-Authentifizierungsheader verwendet wird: authorization: mytoken(Dies muss der Fall sein, sonst würde der APN-Dienst nicht mit dem Status 200 antworten.)
  • Bestätigt, dass meine Anwendung über die in Xcode definierten korrekten Berechtigungen und Funktionen verfügt (meine Argumentation: Dies muss der Fall sein, andernfalls würden Push-Benachrichtigungen für "Warnungen" ebenfalls nicht funktionieren).
  • Doppelte Überprüfung, ob Push-Benachrichtigungen für die Mac-App zulässig / aktiviert sind (überprüfte Systemeinstellungen)
  • Stellen Sie sicher, dass das Gerätetoken, an das der Push gesendet wird, tatsächlich von dem Gerät stammt, das den Push empfangen soll (z. B. mein MacBook).
  • Überprüft, ob der private Schlüssel, den ich zum Signieren des JWT verwende, APN-fähig ist
  • Getestet, während die Mac-App ausgeführt wird, aber nicht im Fokus und auch im Fokus

Die APN-Anforderungen, die ich zum Senden des Pushs ausführe, sind:

Die Nutzlast (JSON), die ich im Anforderungshauptteil an den APN-Dienst sende, sieht wie folgt aus:

{
   "aps": {
      "content-available": 1 # defines push as "silent"
   },
   "data": { #some key-value pairs here }
}

In jedem Fall (sowohl Produktion als auch Sandbox, beide mit dem Geräte-Token von iOS und macOS) wird meine Anfrage an APN mit dem Statuscode 200 zurückgegeben. Auf meinem MacBook wird Catalina 10.15.3 ausgeführt. Was mache ich hier möglicherweise falsch oder wird das für Catalyst-Apps einfach nicht unterstützt?

Philipp Jahoda
quelle

Antworten:

2

Wow doozy Frage. Ich bin mit den Kopfschmerzen von APNs einigermaßen vertraut, aber aus den neuesten Dokumenten ist mir etwas aufgefallen :

Darüber hinaus sollte die POST-Anforderung der Benachrichtigung das Headerfeld apns-push-type mit dem Wert background und das Feld apns-priority mit dem Wert 5 enthalten. Der APNs-Server benötigt das Feld apns-push-type, wenn Push-Benachrichtigungen an gesendet werden Apple Watch und empfiehlt es für alle Plattformen. Weitere Informationen finden Sie unter Erstellen und Senden einer POST-Anforderung an APNs.

Macht die Priorität 5 einen Unterschied?

Normalerweise versuche ich, diese Probleme zu beheben, in einem Archiv zu testen, im Gegensatz zu einem Xcode-Build. AFAIK, der Prod-Push-Server, kann nur an App Store-, Ad-hoc-, Enterprise- oder Testflight-Builds senden. Wenn Sie also nur mit Xcode erstellen, werden Sie wahrscheinlich keine Push-Benachrichtigungen mit Produktions-Apns erhalten.

Matthew Weldon
quelle
1
Danke für deine Gedanken. Ich habe es auch mit dem Affenprioritäts-Header (Wert 5) versucht, leider kein Unterschied. Ich werde die letzten Vorschläge ausprobieren, die Sie zum Testen mit einem archivierten Build gemacht haben.
Philipp Jahoda
@PhilippJahoda fyi-Archivierung ist nur die halbe Lösung. Sie müssen noch Ad-hoc oder eine der anderen von mir aufgeführten Methoden verteilen, um Push-Benachrichtigungen für die Produktion zu erhalten. Dies macht das Debuggen auch zu einem größeren Problem. Hoffentlich können Sie das lösen, ich würde mich freuen zu wissen, wann Sie es tun.
Matthew Weldon
Ja, danke für das Heads-up. Dieses Ding ist ein großer Schmerz im Arsch. Noch mehr Gedanken? Ich kann mich nicht darum kümmern, dass es unter iOS funktioniert, aber nicht unter macOS.
Philipp Jahoda