2014-12-16 10 views
17

La mia app esegue il recupero in background silenzioso tramite notifiche push. Tutto funziona correttamente e le notifiche push inviate dal nostro server attivano i recuperi in background silenziosi come previsto, quando l'utente ha aperto l'app negli ultimi 60 minuti o è stata inviata una notifica push entro 60 minuti, anche se il dispositivo è bloccato.Notifiche push in background iOS non ricevute dopo 2-3 ore di inattività

Tuttavia, quando l'utente non apre l'app per 2-3 ore o quando non è stata inviata una notifica push in 2-3 ore, l'app non riceve la notifica push. Ho la registrazione delle attività app, e ho confermato che:

didReceiveRemoteNotification:fetchCompletionHandler: 

non viene chiamato il delegato app.

Alcuni fatti di più:

  1. In plist.info della app, ho impostato UIRequiresPersistentWiFi true e UIBackgroundModes a (solo) a distanza di notifica
  2. Il carico utile di notifica push contiene solo il contenuto-disponibili chiave
  3. Dopo 2-3 ore di inattività (da nessuna notifica push inviata o nessuna attività dell'utente), sto vedendo lo stesso risultato sia sul mio iPhone 5 che su iPad solo iPad 2, entrambi con iOS 8.1.2. In altre parole, non importa se la connessione Internet è cellulare o Wifi.
  4. Non credo di dover superare i limiti del limite di velocità poiché sto inviando al massimo 1-2 notifiche push per dispositivo all'ora.

mia comprensione è che iOS dovrebbe continuare a svegliare l'applicazione in background e consentirgli di elaborare lo sfondo recuperare dalla notifica push - anche dopo ore di inattività (a patto che il dispositivo è sveglio e ha un connessione internet).

Mi chiedo se qualcun altro ha sperimentato questo, e se è così, se hai trovato una soluzione alternativa.

Grazie in anticipo!

+1

Abbiamo un problema simile. Se invio "contenuto disponibile": 1 notifica dopo un periodo di inattività più lungo, viene ignorata. Tuttavia, se invio una notifica "normale", viene visualizzata sul telefono. Non riesco davvero a trovare un modello, dal momento che per esempio ho lasciato 2 telefoni durante la notte, e uno di loro ha risposto, e l'altro no. Sei riuscito a trovare ulteriori indizi al problema? –

+0

Avete trovato una soluzione per questo? Sto avendo lo stesso problema ... – Jacob

+0

@Jacob, hai provato a inviare un payload con il tasto "suono" vuoto? questo di solito funziona –

risposta

0

Non ci sono soluzioni alternative. Puoi provare PushKit (notifiche push VOIP iOS), che sono più affidabili ma solo iOS8 o socket persistente VOIP, che è disponibile da iOS7 (molto più difficile).

Apple non garantisce la consegna immediata per notifiche push in background/fetch (contenente: content-available=1). Queste notifiche sono state progettate per consentire all'app a chance di aggiornare il suo contenuto tra una serie e l'altra, senza essere "immediate" né affidabile.

iOS deciderà quando consegnare queste notifiche in base a condizioni non documentate relative all'energia.

In altre parole, l'app verrà notificata, solo quando deciderà iOS, non influirà sulla batteria. Dalle mie osservazioni, dipende da molte cose, come:

  • se il dispositivo è collegato alla presa di corrente,
  • usa Wi-Fi del 3G,
  • tempo dall'ultima notifica,
  • energia e App di larghezza di banda dati utilizzata durante l'elaborazione dell'ultima, itd ...
  • quando e come è stato dispositivo utilizzato nel recente passato (bloccato schermo/sbloccato)

Ho anche notato la differenza tra applicazione in esecuzione in sessione di debug (da Xcode, collegato via cavo) - notifiche sono state sempre consegnate, e quando ho avviato app da Springboard/in modalità di rilascio (diverse condizioni di energia), ha iniziato a comportarsi in modo anomalo.

+0

Cosa succede se ho rimosso la chiave content-available dal mio payload? Ho ancora problemi dopo che l'app è rimasta inattiva. Sembra così casuale. Non riesco mai a ricordare di non ricevere notifiche sul mio telefono, ora sta accadendo tutto il tempo sull'iPad. – Jacob

+0

Quando si rimuove il flag di contenuto disponibile, il metodo di delega non verrà MAI chiamato quando l'app è in background da sola. Si vedrà solo il banner nel centro notifiche e sarà necessario toccarlo (interagire con) per richiamare il callback. – Lukasz

+0

L'app è sempre in primo piano, sempre. Questo è il motivo per cui non capisco le discrepanze perché il metodo dovrebbe sempre essere chiamato. – Jacob

0
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
[[UIApplication sharedApplication] registerForRemoteNotifications]; 
+0

Puoi commentare cosa effettivamente fa questo codice piuttosto che pubblicarlo come risposta? – JAL

0

Prova questo nel tuo info.plist ha funzionato per me.

info plist file.

Questo si sveglierà la vostra applicazione per ricevere la notifica in modalità background.

1

passare attraverso

Obiettivi> Funzionalità> Modalità Sfondo

Accendere Modalità sfondo