Ich habe festgestellt, dass unter iOS 11 Beta 2 die stillen Benachrichtigungen nicht an das gesendet werden application:didReceiveRemoteNotification:fetchCompletionHandler
unabhängig vom Status der App (Hintergrund / Vordergrund) gesendet werden.
Ich habe die UIApplicationDelegete
Methode implementiert application:didReceiveRemoteNotification:fetchCompletionHandler
und sende den folgenden stillen Push
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
Die Delegate-Methode wird jedoch unter iOS 11 nicht aufgerufen.
Es funktioniert gut mit anderen Versionen von iOS und dem Dokumentationsabschnitt Konfigurieren einer stillen Benachrichtigung wird nicht erwähnt, dass etwas anderes getan werden sollte.
Ist das ein Fehler in iOS 11 oder habe ich etwas Neues in iOS 11 verpasst?
Bitte beachten Sie, dass ich nicht über das spreche oder es benutze UserNotification
Framework für das Senden stiller Pushs nicht benötigt werden sollte.
Hier ist ein Beispielprojekt , das das Problem veranschaulicht (Sie müssen Ihre eigene Bundle-ID festlegen).
Wenn Sie das Beispielprojekt zu Mittag essen und eine der oben genannten Nutzdaten an die App senden, können Sie mithilfe der macOS-Konsole feststellen, ob der Push korrekt an das Gerät, jedoch nicht an die App gesendet wurde.
UPDATE 10.08
Es scheint, dass das Verhalten zufällig ist. Manchmal wird die Nutzlast nach dem Neustart des Geräts korrekt geliefert, funktioniert aber nach einer Weile nicht mehr.
Wie Sie auf dem folgenden Screenshot sehen können, wird der als 1 gekennzeichnete Push nur an das Gerät gesendet, und der Push 2 (nach dem Neustart des Geräts) wird auch an die App gesendet.
UPDATE 14.08 - iOS 11 Beta 6
Immer noch das gleiche Verhalten. Eine andere Sache, die funktionieren soll, aber nicht funktioniert, ist die folgende. Wenn das Schema der Anwendung auf "Warten auf den Start der ausführbaren Datei" eingestellt ist, soll ein stiller Push die App aktivieren und im Hintergrund starten.
UPDATE 21.08 - iOS 11 Beta 7
Immer noch das gleiche Verhalten und keine Updates von Apple im Fehlerbericht.
UPDATE 29.08 - iOS 11 Beta 8
Immer noch das gleiche Problem. Die Schritte zum Reproduzieren, die ich jetzt verwende, sind die folgenden:
- Wählen Sie im Xcode-Projektschema "Warten Sie, bis die ausführbare Datei gestartet wird".
- Fügen Sie einen Haltepunkt in das Feld ein
didReceiveRemoteNotification: fetchCompletionHandler
- Starten Sie die App auf dem Gerät
- Senden Sie den obigen stillen Druck
Erwartet : Die App wird aus dem angehaltenen Zustand in den Hintergrund gebracht und didReceiveRemoteNotification: fetchCompletionHandler
aufgerufen
Tatsächlich : nichts passiert
UPDATE 06.09 - iOS 11 Beta 10
Ich habe immer noch das gleiche Buggy-Verhalten. Das Ticket von Apple wurde mit folgender Antwort aktualisiert:
Apple Developer Relations 6. September 2017, 22:42 Uhr Engineering hat das folgende Feedback zu diesem Problem gegeben:
Wir konnten die Beispiel-App zum Laufen bringen und das Verhalten testen. Wir haben keine Probleme gesehen, als wir dies wie beschrieben getestet haben.
Es wird nicht garantiert, dass Pushs bei der App ankommen, wenn sie im Hintergrund ausgeführt wird. Die Protokolle hier zeigen, dass wir nicht glauben, dass die App zum Starten ausreichend verwendet wird.
Wir sehen, dass wir von Zeit zu Zeit Pushs liefern, wenn die Bedingungen gut sind.
Wir glauben, dass sich das richtig verhält.
Update 11.09
Mein Apple-Fehlerbericht wurde geschlossen und als Duplikat markiert, von 33278611
dem noch offen ist
UPDATE 13.09 - iOS 11 GM
Dank der Kommentare von kam800 (siehe unten) habe ich weitere Tests durchgeführt und diese Beobachtungen gemacht:
In iOS 11 scheint es einen neuen Daemon zu geben dasd DuetActivitySchedulerDaemon
, der den Daten-Push entweder vollständig verwirft oder die Daten-Push-Bereitstellung verzögert:
Lieferung verschoben
Konsolenprotokolle
default 13:11:47.177547 +0200 dasd DuetActivitySchedulerDaemon CANCELED: com.apple.pushLaunch.net.tequilaapps.daylight:C03A65 <private>! lifecycle com.apple.duetactivityscheduler
default 13:11:47.178186 +0200 dasd DuetActivitySchedulerDaemon Removing a launch request for application <private> by activity <private> default com.apple.duetactivityscheduler
default 12:49:04.426256 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.5 minutes to Wed Sep 13 12:55:31 2017 default com.apple.duetactivityscheduler
default 13:21:40.593012 +0200 dasd DuetActivitySchedulerDaemon Activity <private>: Optimal Score 0.6144 at <private> (Valid Until: <private>) scoring com.apple.duetactivityscheduler
default 13:21:40.594528 +0200 dasd DuetActivitySchedulerDaemon Setting timer (isWaking=1, activityRequiresWaking=0) between <private> and <private> for <private> default com.apple.duetactivityscheduler
Verschobene Lieferprobleme
- Wenn die Übermittlung des Daten-Push verschoben und die App gestartet wird, wird der Daten-Push nur zugestellt, wenn der Übermittlungstermin erreicht ist, der in Zukunft mehrere Minuten betragen kann. Dies macht den Zweck der Verwendung von Daten-Pushs zunichte, um den Inhalt der neuen App für den nächsten Start bereit zu halten. Ich zitiere hier noch einmal Apples Dokumentation:
"Stille Benachrichtigungen verbessern die Benutzererfahrung, indem sie Ihnen helfen, Ihre App auf dem neuesten Stand zu halten, auch wenn sie nicht ausgeführt wird."
- Wenn zwei Daten-Pushs an eine angehaltene App gesendet werden, werden sie von iOS 11 verschoben, anstatt die App direkt zu aktivieren. Wenn die Lieferzeit erreicht ist, wird nur der letzte Daten-Push geliefert! Die vorherigen Pushs gehen verloren und werden nicht über die Delegate-Methode übermittelt, was zu einem Datenverlust führt.
Lieferung storniert
Konsolenprotokolle
default 13:35:05.347078 +0200 dasd DuetActivitySchedulerDaemon com.apple.pushLaunch.net.tequilaapps.daylight:C03A65:[
{name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}}
], FinalDecision: Must Not Proceed} scoring com.apple.duetactivityscheduler
Stornierte Lieferprobleme
In diesem Fall geht der Daten-Push vollständig verloren und wird unter iOS 11 nie geliefert, während er unter iOS 10 korrekt geliefert wurde.
UPDATE 19.09 - iOS 11 GM
Ich habe auch festgestellt, dass in der Konsole die folgenden Protokolle angezeigt werden, wenn sich die Anwendung im Vordergrund befindet und die Benachrichtigung nicht an die App gesendet wird:
default 08:28:49.354824 +0200 apsd apsd <private>: Received message for enabled topic '<private>' onInterface: NonCellular with payload '<private>' with priority 10 for device token: NO courier-oversized com.apple.apsd
fault 08:33:18.128209 +0200 dasd Foundation <NSXPCConnection: 0x151eee460> connection from pid 55: Exception caught during decoding of received message, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
Exception: value for key 'NS.objects' was of unexpected class 'NSNull'. Allowed classes are '{(
NSArray,
NSData,
NSString,
NSNumber,
NSDictionary,
NSUUID,
_DASActivity,
NSSet,
_DASFileProtection,
NSDate,
NWParameters,
NWEndpoint
)}'. general com.apple.foundation.xpc
"content-available": 1
und die App im Vordergrund steht, wird der Rückruf nicht ausgelöst.