Push silenziosi non consegnati all'app su iOS 11


168

Ho notato che su iOS 11 beta 2, le notifiche silenziose non vengono recapitate application:didReceiveRemoteNotification:fetchCompletionHandlerindipendentemente dallo stato dell'app (sfondo / primo piano).

Ho implementato il UIApplicationDelegetemetodo application:didReceiveRemoteNotification:fetchCompletionHandlere 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 UserNotificationframework 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.

inserisci qui la descrizione dell'immagine

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.

inserisci qui la descrizione dell'immagine

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: fetchCompletionHandlerviene 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 33278611cui 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 DuetActivitySchedulerDaemonche 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

1
ancora non risolto in Beta 8, quando guardo nella console vedo il seguente errore: <NSXPCConnection: 0x123f43620> connessione da pid 58: eccezione rilevata durante la decodifica del messaggio ricevuto, eliminando il messaggio in arrivo. Eccezione: eccezione durante la decodifica dell'argomento 0 (n. 2 dell'invocazione): eccezione: il valore per la chiave "NS.objects" era di classe imprevista "NSNull". Le classi consentite sono '{(NWParameters, NWEndpoint, NSArray, NSData, NSString, NSNumber, NSDictionary, NSUUID, _DASActivity, NSSet, _DASFileProtection, NSDate)}'.
Thomas Einwaller,

2
Sto ottenendo lo stesso risultato con iOS 11 (non prima), se invio con il push con "content-available": 1e l'app è in primo piano, il callback non verrà attivato.
GoRoS,

4
Dopo aver testato con il nuovo iOS11.1 beta 1 sembra che questo sia stato risolto ora e funzioni come prima su iOS 10
Lee,

3
Whatsapp sembra aver avuto un problema simile whatsappen.com/news/5465/… Qualcosa sugli utenti che "costringono abitualmente a chiudere le loro app" che è la maggior parte degli sviluppatori ...
toxaq

3
E esattamente lo stesso con la versione pubblica di 11.1. Se stai utilizzando i push silenziosi e la tua app è in primo piano, non aspettarti che vengano consegnati in base a diverse cose, ma principalmente ai livelli della batteria, anche se il dispositivo è collegato a un alimentatore.
Gruntcakes,

Risposte:


31

Quindi dicono le note di rilascio di iOS 11.1 beta 1

iOS 11.1 beta 1 è stato appena rilasciato e menzionano: "Notifiche risolte Problemi • Le notifiche push silenziose vengono elaborate più frequentemente. (33278611)

Ho fatto alcuni test e sembra che sia stato corretto:

Stato sospeso

Quando avvio l'app in modalità sospesa e invio un push silenzioso, l'app viene riportata in background e didReceiveRemoteNotification:fetchCompletionHandlerviene chiamato il delegato.

Stato in primo piano

Allo stesso modo, quando l'applicazione è in primo piano e viene inviato un push silenzioso, il delegato sembra essere chiamato come previsto. Questo non funzionava in modo casuale nelle precedenti versioni di iOS 11, quindi lo confermerò dopo ulteriori test.


3
Sui miei test iniziali ho pensato che fosse corretto. Ha funzionato per un po '. Ma dopo alcuni pesanti test, le cose hanno iniziato a cadere una parte. Improvvisamente ha smesso di chiamare il delegato per ogni spinta silenziosa, anche con l'app in primo piano. Apparentemente, questo nuovo sistema di "duetto" sta bloccando il delegato della mia app per essere chiamato a causa della mancanza di "energyBudget". Quindi, purtroppo, non è stato ancora risolto.
Abras,

incredibile :(
Thomas Einwaller,

La mia esperienza è la stessa di Abras sopra. Ha lavorato per un po 'poi si è rotto e il gestore non è più stato chiamato - questo fa schifo,
Lee

Dopo altri test sono stato in grado di trovare un modo per far ricevere nuovamente notifiche al dispositivo. Collegalo all'alimentazione. Non appena si collega il dispositivo per l'alimentazione, inizierà nuovamente a ricevere tutte le notifiche remote. Se lo scolleghi, si interrompe. Questo non ha senso, perché in tutti i miei test l'app era in primo piano. E le app in primo piano sono garantite per ricevere notifiche remote.
Abras,

per me funziona tutto bene anche quando su una connessione cellulare senza essere collegato a una potenza. Solo quando imposto il dispositivo in modalità di risparmio energetico, non riesco a spingere nemmeno in primo piano. Ma questo è qualcosa che non avevo capito
Jan

18

Volevo solo aggiungere i miei 2 centesimi qui perché sono stato colpito anche da questo problema e ho notato che Apple ha chiuso diversi radar su questo problema dicendo che non potevano riprodursi. Una cosa interessante che ho scoperto è che i push verranno consegnati se l'app è in background mentre è collegata al debugger.

Se uccido il debugger, scollego il telefono, avvio l'app e invio il payload push silenzioso vedo che l'app NON viene svegliata. Nel registro della console vedo che il sistema annulla la consegna del payload alla mia app.

Ho inviato un radar con una piccola app di esempio che riproduce il problema. Ho anche notato esplicitamente nel radar che la persona che lavora sul mio ticket non deve eseguire l'app allegata al debugger per riprodurre il problema. Ecco il link: https://bugreport.apple.com/web/?problemID=34461063

Si spera che ciò comporti alcuni progressi su questo problema.


2
Grazie per la segnalazione. Btw, che collega il bug di Apple non vi aiuterà qui in quanto sono private e solo il giornalista e Apple possono vedere
Jan

Mi piacerebbe vedere più persone usare openradar.appspot.com in modo da poter tenere traccia dei radar di altre persone
Thomas Einwaller,

ci sono aggiornamenti sulla segnalazione di bug con apple @bill
MagicFlow

Non ho ricevuto aggiornamenti sul mio radar da Apple, ma abbiamo installato la versione beta di iOS 11.1 e sembra che il problema sia stato risolto.
Bill Dunay,

Sì, stiamo riscontrando lo stesso problema anche in iOS 11.2.6. Qualche soluzione o aggiornamento?
Gopik,

14

Sembra un nuovo comportamento di iOS 11. iOS 11 beta 10 fornisce alcuni registri descrittivi riguardanti questo problema:

default 23:18:51.806011 +0200   dasd    com.apple.pushLaunch.com.acme.Acme:F7E7D0:[
    {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Can Proceed, Score: 0.50}}
    {name: BatteryLevelPolicy, policyWeight: 1.000, response: {Decision: Can Proceed, Score: 0.87, Rationale: [{batteryLevel == 62}]}}
    {name: DeviceActivityPolicy, policyWeight: 5.000, response: {Decision: Can Proceed, Score: 0.20}}
 ] sumScores:52.279483, denominator:81.410000, FinalDecision: Can Proceed FinalScore: 0.642175}
default 23:18:51.806386 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' has compatibility score of 1.000000 with 'com.apple.CFNetwork-cc-111-79:E7272D'. Relaxing scores.
default 23:18:51.806855 +0200   dasd    'com.apple.pushLaunch.com.acme.Acme:F7E7D0' CurrentScore: 0.642175, ThresholdScore: 0.738454 DecisionToRun:0

Sembra che ogni push silenzioso sia consegnato a iOS, ma il demone dasd usa un paio di criteri per decidere se il push silenzioso debba essere consegnato all'app (ad esempio il livello della batteria). Sono riuscito a ricevere una spinta silenziosa ieri sera, ma il mio iPhone era collegato al caricabatterie in quel momento - probabilmente il punteggio BatteryLevelPolicy era abbastanza alto da ricevere quella spinta silenziosa.

Apple non fornisce informazioni ufficiali su questo comportamento lato iOS, ci sono solo informazioni sulla limitazione lato server:

Le notifiche silenziose non sono pensate come un modo per mantenere la tua app in background, né sono pensati per aggiornamenti ad alta priorità. Gli APN considerano le notifiche silenziose come a bassa priorità e possono limitare del tutto la loro consegna se il numero totale diventa eccessivo. I limiti effettivi sono dinamici e possono variare in base alle condizioni, ma cerca di non inviare più di alcune notifiche all'ora.

Tengo le dita incrociate e hanno cambiato quel comportamento, perché ciò avrebbe risolto la mia app :) D'altra parte, questo cambiamento è buono - una delle molte cose che rende la batteria dell'iPhone più lunga rispetto ai telefoni Android.


1
Sì, i push vengono inviati al dispositivo ma non all'app. Questo è quello che ho scritto nel mio post originale. "Le notifiche silenziose non sono pensate come un modo per mantenere la tua app in background", va bene finché vengono consegnate "a volte". Il grosso problema è che le notifiche silenziose non vengono mai recapitate all'app in iOS 11 quando è in background. Questo sconfigge completamente l'intero scopo dei push di dati.
Jan

Sì, l'hai già scritto, volevo solo fornire una spiegazione completa riguardo a queste nuove politiche push. Ho citato documenti di Apple per dimostrare che avevano già messo in guardia dall'incertezza della consegna push. Mentre scrivevo: "Sono riuscito a ricevere una spinta silenziosa ieri sera" (nell'app che intendevo dire) e l'app era in background. Ma nel corso della giornata - la mia app non riceve alcun push :( Secondo me Apple allenterà queste politiche push nella versione RC. D'altra parte, potrebbero ripristinare il comportamento push originale - hanno già usato per sbarazzarsi delle funzionalità fornite solo in versioni beta (ad es. il completamento automatico del portachiavi 10.3)
kam800

Vedo registri simili quando viene ricevuto il push e l'app è sospesa. Il dasd processo quindi registra default 10:17:42.994236 +0200 dasd DuetActivitySchedulerDaemon Advancing start date for <private> by 6.3 minutes to Wed Sep 13 10:24:03 2017. La spinta silenziosa sembra essere consegnata in quel momento.
Jan

ho già iniziato i test con iOS 11 GM, vedendo ancora comportamenti strani, registri come com.apple.fetch.com.troii.timriphone:F613DA:[ {name: ApplicationPolicy, policyWeight: 50.000, response: {Decision: Must Not Proceed, Score: 0.00}} ], FinalDecision: Must Not Proceed}
Thomas Einwaller,

1
Inoltre, sono riuscito a risolvere la mia app inviando push non silenzioso con alcune notifiche stub e riempiendo la notifica con il giusto contenuto utilizzando l'estensione del servizio di notifica.
Kam800,

9

Le note sulla versione beta di iOS 11.1 includono: Notifiche risolte Problemi Le notifiche push silenziose vengono elaborate più frequentemente. (33278611)


7

iOS 11.1 Beta 2 contiene anche

Notifications
Resolved Issues
 Silent push notifications are processed more frequently. (33278611)

nelle Note di rilascio - lo testerà ora.

AGGIORNAMENTO - 11.10.2017 - iOS 11.1 Beta 2

Dopo aver usato la nostra App per 2 giorni in "scenari del mondo reale" sembra che ci sia un vero miglioramento in questa versione di iOS. Comincio con cautela a credere che sia stato risolto.


1
Ho testato diversi scenari: funzionava in primo piano e in background. Purtroppo non funziona se l'app è stata terminata dall'utente. Dopo aver terminato il dispositivo non riceve alcuna spinta silenziosa, a condizione che l'app non venga nuovamente avviata attivamente dall'utente. Hai provato lo stesso?
AlexWoe89,

ora funziona ... dopo un "tempo morto" di ca. Da 5 a 10 minuti le notifiche silenziose funzionano come previsto ... scusate il mio anteprima. commento :)
AlexWoe89,

1
i push silenziosi non hanno mai funzionato quando l'utente termina l'app - vedi developer.apple.com/documentation/uikit/uiapplicationdelegate/… "Tuttavia, il sistema non avvia automaticamente l'app se l'utente ha forzatamente chiuso."
Thomas Einwaller,

1
Sto vedendo che iOS11.1 beta 3 funziona in modo molto simile a iOS10 e molto meglio di iOS11.1 beta 2.
Lee,

1
@Olecramoak per me iOS11.1 beta 4 funziona come iOS 10.
AlexWoe89

7

Apple Developer Relations ha appena aggiunto un commento al mio radar:

Riteniamo che questo problema sia stato risolto nell'ultima versione beta di iOS 11.2.

Si prega di testare con l'ultima beta di iOS. Se i problemi persistono, si prega di aggiornare la segnalazione di bug con eventuali registri o informazioni pertinenti che potrebbero aiutarci a indagare.

https://developer.apple.com/download/

al momento l'installazione di iOS 11.2 beta - verificherà il comportamento push silenzioso


Questo significa che iOS 11.1 GM non risolverà il problema? :(
Olecramoak,

È bello sapere, quando possiamo davvero aspettarci l'uscita ufficiale di iOS11.1?
AlexWoe89,

Tienici aggiornati, al momento non è possibile installare la mia app in quanto non è disponibile Xcode per 11.2. (e ho rimosso l'app dal mio dispositivo)
Rool Paap

3

Ho avuto un problema simile con la mia app, fino a quando iOS 10 ricevevo notifiche push e application:didReceiveRemoteNotification:fetchCompletionHandlervenivano chiamate correttamente, ma quando sono state aggiornate le notifiche push di iOS 11 hanno smesso di funzionare.

Il problema con il mio codice era, anche se stavo usando content-available: 1 e mutable-content: 1 nel payload di notifica push, l'opzione Background Fetch non era attivata. Ma funzionava perfettamente fino a iOS 10.

Assicurati di aver attivato entrambe queste funzionalità.

Dopo aver attivato la funzionalità di recupero in background, funziona ora


no non funziona per iOS11: basta terminare l'app una volta, quindi smette di riattivare l'app. leggi le risposte e i commenti in questo argomento
AlexWoe89,

2
Per l'app terminata, eventuali notifiche push (sielent o push generali) non genereranno il metodo delegato nel delegato dell'app. questo è il comportamento predefinito. Non esiste un caso speciale per iOS 11.0.
Sudeep george,

3

iOS 11.4.1, Swift 4

Avevo problemi con il push silenzioso che non arrivava (da CloudKit) e ho provato tutto ciò che tutti hanno menzionato qui. Quindi ho deciso di provare a impostare uno spazio vuoto alertBodyper i miei CKNotificationInfo()oggetti in questo modo:

let info = CKNotificationInfo()
info.shouldSendContentAvailable = true
info.alertBody = ""

Ciò ha fatto sì che i push venissero inviati con una priorità più alta (ma erano comunque push silenziosi) e non ho più ricevuto l'errore nei miei registri del dispositivo che il push veniva ignorato.

Spero che aiuti qualcuno. :)


Funziona anche con me con CloudKit. Senza alertBody, è necessario collegare il dispositivo per ottenere le notifiche remote. Comportamento molto strano ...
powertoold

2

Quindi questo è davvero un bug in iOS 11 ed è ora risolto in iOS 11 beta 3. application:didReceiveRemoteNotification:fetchCompletionHandlerViene ora chiamato correttamente quando viene ricevuto un push silenzioso sia in primo piano che in background.

AGGIORNARE

No, non è stato risolto e continua a verificarsi in iOS beta 3 e 4


1
In realtà non lo è :( Sta ancora accadendo in iOS 11 beta 3
Jan

1
Anche Apple ha riaperto la segnalazione di bug. Ti farò sapere
Jan

1
Non ricevo push silenziosi in iOS 11 beta 4. Più preoccupante, se l'app non è in primo piano, a volte vengono visualizzate come notifiche regolari. Sicuramente qualcosa!
Ben Dodson,

1
Quindi ho appena installato iOS 11 beta 5 e sembra migliore e le notifiche silenziose vengono consegnate quando l'app è in primo piano o in background tramite il delegato didReceiveRemoteNotification per un po ', poi ha smesso di funzionare, qualunque cosa io faccia: / Hai lo stesso comportamento?
Jan

1
sarebbe bello se ci provi e questo mi fa venire il mal di testa. I push silenziosi funzionano o non funzionano in modo casuale dopo il riavvio del dispositivo. Ho aggiornato il mio post originale con un progetto di esempio in modo che noi tutti usiamo lo stesso
Jan

2

Come soluzione alternativa stiamo aggiungendo una chiave di "notifica" e all'interno di un "titolo" con una stringa vuota come valore. Questo è riattivare il callback didReceive in AppDelegate.


1
Questo ha funzionato per me e una soluzione alternativa per ottenere DuetActivitySchedulerDaemon per consentire alla notifica di riattivare l'app, fino a quando apple non risolve il bug.
Joe Benton,

Quando spingo un JSON contenente un titolo vuoto, ricevo ancora il messaggio sulla console "Ignorare la notifica senza avviso, suono o badge ..." {"aps": {"alert": {"title": ""}, "content-available": "1"}, "gcm.message_id": "0 ... bb"} Questa struttura JSON funziona per te?
Olecramoak,

non dovresti inviare 1 (valore per il contenuto disponibile) senza virgolette?
elkorb,

Ecco come Google Firebase formatta Json ("1") e ha sempre funzionato. Solo iOS 11 con le assurdità dasd sta creando un problema. Potresti per favore pubblicare un esempio di Json che sta lavorando per te?
Olecramoak,

Quindi ciò che sto osservando su iOS 11.1 è che le spinte silenziose non vengono erogate se il dispositivo è alimentato a batteria (non in carica) e il livello della batteria è inferiore al 20%, anche quando la modalità di risparmio energetico NON è attivata. Questo non va bene. I push silenziosi su iOS 11 non sono affatto affidabili, quasi inutili.
Olecramoak,

1

Al momento di scrivere questa risposta, sto affrontando lo stesso identico problema della risposta di Bill Dunay .

Il mio requisito era ricevere notifiche silenziose quando l'app è in primo piano e nulla quando l'app è in background / non è in esecuzione. E la mia soluzione è stata questa. Non utilizzo i badge, quindi impostarlo su zero non è un problema per me.

{
    "aps" : {
        "badge" : 0,
        "sound" : ""
    },
    "mydata": {  
        "foo": "bar"  
    }  
}

Si prega di notare che non sto usando deliberatamente "contenuto disponibile". Impostazione che provoca l'avvio della logica di ottimizzazione di iOS nel ritardare / annullare la consegna della notifica.


1

Ho ricevuto lo stesso problema per alcune notifiche (non necessariamente silenziose).

Dopo aver esaminato tutti gli aggiornamenti e le risposte sono in grado di aggiungere due aggiornamenti che potrebbero essere d'aiuto:

  • Ho scoperto che l'accesso al UIApplication.shared.isRegisteredForRemoteNotificationsmetodo durante la ricezione di una notifica provoca lo stallo dell'applicazione senza segnalare nulla a Xcode. Controlla se stai eseguendo del codice dopo aver ricevuto la notifica che accede al metodo. ( isRegisteredForRemoteNotifications UI di blocco con semaphore_wait_trap ).

    • Ho scoperto che avevo una notifica push che analizzava l'errore sulla console a causa della "title-loc-args" : [3333]non accettazione letterale del 3333 ma dell'accettazione come stringa "title-loc-args" : ["3333"]. Questo ha reso la mia intera interfaccia bloccata dopo aver effettuato l'accesso al metodo sopra, solo su iOS 11, funziona su iOS 12.
  • Ho anche scoperto che, con lo stesso identico codice, funziona senza problemi su iOS 12.0 (16A5366a) . Ma su iOS 11 sta succedendo.


1

Nel mio caso, le notifiche silenziose sono state utilizzate per aggiornare l'interfaccia utente dopo che il lavoro è stato eseguito sul sito del server, quindi è stato doloroso avere contenuti non pertinenti nell'app. Poiché il nostro payload per la notifica silenziosa contiene anche titolo e corpo, implemento questi metodi per ottenere notifiche funzionanti nell'app attiva / inattiva, non in carica e con Aggiornamento app in background disattivato e anche in stato di risparmio energetico.

Per farlo funzionare, aggiungo delegato e creo l'estensione con UNUserNotificationCenterDelegateprotocollo e willPresent notificationmetodo (iOS 10+), che viene attivato ogni volta con il payload corretto. Per non mostrare la notifica quando l'app è attiva, basta chiamare il completamento con badge o suono. Ho finito con qualcosa del genere

    import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    // MARK: - Lifecycle
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    //this was only method to handle notifications before
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //process silent notification
        completionHandler(UIBackgroundFetchResult.newData)
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //proces notification when app is active with `notification.request.content.userInfo`
        if UIApplication.shared.applicationState == .active {
            completionHandler(.badge)
        }else {
            completionHandler(.alert)
        }
    }
}

E per funzionare in questi stati quando l'app è in background e la notifica silenziosa non chiama i miei metodi, ricevo le notifiche dal centro notifiche direttamente applicationDidBecomeActiveda:

UNUserNotificationCenter.current().getDeliveredNotifications { (notifications) in
            debugLog(message: "unprocessed notification count: \(notifications.count)")
            if notifications.count > 0 {
                notifications.forEach({ (notification) in
                    DispatchQueue.main.async {
                        //handle `notification.request.content.userInfo`
                    }
                })
            }
        }

0

Nel mio caso, "Aggiornamento app in background" è stato disattivato nelle impostazioni di iPhone. A causa di questa notifica push è stata consegnata al dispositivo ma non sull'app. L'attivazione di Aggiornamento app in background riceve il push silenzioso nell'app.

Questa potrebbe non essere la risposta effettiva a questa domanda, nel caso in cui qualcuno debba verificare.

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.