Ho notato che su iOS 11 beta 2, le notifiche silenziose non vengono recapitate application:didReceiveRemoteNotification:fetchCompletionHandler
indipendentemente dallo stato dell'app (sfondo / primo piano).
Ho implementato il UIApplicationDelegete
metodo application:didReceiveRemoteNotification:fetchCompletionHandler
e invio la seguente push silenziosa
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
ma il metodo delegato non viene chiamato su iOS 11.
Funziona bene su altre versioni di iOS e la sezione della documentazione Configurare una notifica silenziosa non menziona che altro dovrebbe essere fatto.
È un bug in iOS 11 o ho perso qualcosa di nuovo in iOS 11?
Si noti che non sto parlando o utilizzando il UserNotification
framework che non dovrebbe essere necessario per inviare push silenziose.
Ecco un progetto di esempio che illustra il problema (dovrai impostare il tuo ID bundle)
Quando pranzi il progetto di esempio e invii un payload sopra all'app, puoi usare la console macOS per vedere che il push è correttamente consegnato al dispositivo ma non all'app.
AGGIORNAMENTO 10.08
Sembra che il comportamento sia casuale. A volte dopo il riavvio del dispositivo, il payload viene consegnato correttamente ma dopo un po 'smette di funzionare.
Come puoi vedere nello screenshot seguente, il push contrassegnato come 1 viene trasferito solo al dispositivo e anche il push 2 (dopo il riavvio del dispositivo) viene consegnato all'app.
AGGIORNAMENTO 14.08 - iOS 11 Beta 6
Sempre lo stesso comportamento. Un'altra cosa che dovrebbe funzionare ma non è la seguente. Quando lo schema dell'applicazione è impostato su "Attendi l'avvio dell'eseguibile", si suppone che un push silenzioso riattivi l'app e la avvii in background.
AGGIORNAMENTO 21.08 - iOS 11 Beta 7
Sempre lo stesso comportamento e non aggiornamenti da Apple nella segnalazione di bug.
AGGIORNAMENTO 29.08 - iOS 11 Beta 8
Sempre lo stesso problema. I passaggi per riprodurre che utilizzo ora sono i seguenti:
- Nello schema del progetto Xcode, selezionare "Attendi l'avvio dell'eseguibile"
- Aggiungi un punto di interruzione in
didReceiveRemoteNotification: fetchCompletionHandler
- Avvia l'app sul dispositivo
- Invia la spinta silenziosa sopra
Previsto : l'app viene portata dallo stato sospeso allo sfondo e didReceiveRemoteNotification: fetchCompletionHandler
viene chiamata
In realtà : non succede nulla
AGGIORNAMENTO 06.09 - iOS 11 Beta 10
Sto ancora avendo lo stesso comportamento buggy. Il biglietto di Apple è stato aggiornato con la seguente risposta:
Apple Developer Relations, 6 settembre 2017, 22:42 Engineering ha fornito il seguente feedback su questo problema:
Siamo riusciti a far funzionare l'app di esempio e testare il comportamento. Non abbiamo riscontrato alcun problema quando lo abbiamo testato come descritto.
Non è garantito che le push arrivino all'app quando è in esecuzione in background e i registri qui indicano che non crediamo che l'app sia stata utilizzata abbastanza per avviarla.
Ci vediamo fornire periodicamente spinte quando le condizioni sono buone.
Crediamo che questo si stia comportando correttamente.
Aggiornamento 11.09
La mia segnalazione di bug Apple è stata chiusa e contrassegnata come duplicata, di 33278611
cui rimane aperta
AGGIORNAMENTO 13.09 - iOS 11 GM
Grazie ai commenti di kam800 (vedi sotto) ho fatto più test e ho avuto quelle osservazioni:
Sembra che ci sia un nuovo demone in iOS 11 dasd DuetActivitySchedulerDaemon
che scarta completamente il push dei dati o ritarda la consegna del push dei dati:
Consegna posticipata
Registri della console
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
Problemi di consegna posticipati
- Quando la consegna del push di dati viene posticipata e l'app viene avviata, il push di dati viene consegnato solo quando viene raggiunta la data di consegna, che può essere diversi minuti in futuro. Ciò vanifica completamente lo scopo dell'utilizzo dei push di dati per mantenere i contenuti della nuova app pronti per il prossimo lancio. Cito di nuovo qui la documentazione di Apple:
"Le notifiche silenziose migliorano l'esperienza dell'utente aiutandoti a mantenere aggiornata l'app, anche quando non è in esecuzione."
- Quando due push di dati vengono inviati a un'app sospesa, vengono posticipati da iOS 11 invece di riattivare l'app direttamente. Quando viene raggiunto il tempo di consegna, viene consegnato solo l'ultimo push di dati! I push precedenti vengono persi e non vengono consegnati tramite il metodo delegato con conseguente perdita di dati.
Consegna annullata
Registri della console
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
Problemi di consegna annullati
Bene, in questo caso, il push dei dati è completamente perso e mai consegnato su iOS 11 mentre è stato consegnato correttamente su iOS 10.
AGGIORNAMENTO 19.09 - iOS 11 GM
Ho anche notato che quando l'applicazione è in primo piano e la notifica non viene recapitata all'app, vedo i seguenti registri nella console:
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
e l'app è in primo piano, il callback non verrà attivato.