2012-09-05 35 views
5

Ho un'applicazione iOS 5.1 che si registra al servizio APNS per ricevere notifiche. Il registro ha esito positivo e ricevo correttamente le notifiche. Il problema si presenta quando provo a gestire le notifiche.Come posso gestire le notifiche push non lette in iOS?

Una volta che l'applicazione è in esecuzione, il metodo didReceiveRemoteNotification in AppDelegate viene chiamato correttamente e quindi la notifica viene gestita come previsto. Questo, tuttavia, si verifica solo quando l'applicazione è in esecuzione in primo piano.

Tuttavia, quando l'applicazione è in esecuzione in background o viene semplicemente interrotta, tale metodo non viene chiamato. Ho letto che è necessario aggiungere alcune linee al metodo metodo didFinishLaunchingWithOptions per ottenere la notifica dal dizionario userInfo e gestirlo. Funziona bene, ma SOLO quando l'applicazione viene aperta facendo clic sulla notifica nel Centro di notifica. Ciò significa che se apri l'applicazione facendo clic sul suo badge o semplicemente modificando il contesto se lo stavi eseguendo sullo sfondo, l'app non si rende mai conto che è arrivata una notifica. Inoltre, se è stata ricevuta più di una notifica, possiamo gestisci solo uno di essi contemporaneamente facendo clic sul Centro di notifica, che è un dolore :-)

C'è un modo per leggere le notifiche in sospeso nel Centro di notifica? So che c'è un modo per svuotarli usando il metodo cancelAllLocalNotifications ma non ho trovato il modo di leggerli. E ho davvero bisogno di gestirli tutti. Ho pensato di implementare un protocollo di comunicazione con il server di notifica di terze parti per recuperare nuovamente le informazioni quando l'applicazione arriva in primo piano, ma dal momento che le informazioni sono già nel sistema operativo troverei strano se fosse impossibile accedervi in ​​qualche modo.

Quindi, qualcuno sa come farlo? Grazie in anticipo.

risposta

3

Quando arriva una notifica push e l'utente fa clic su "annulla", l'app non ha modo di leggere nuovamente la notifica push. Devi implementare una funzionalità separata (molto probabilmente sul lato server) per recuperare un elenco di notifiche inviate a questo dispositivo.

Ad esempio, se nell'app viene fornita una funzionalità di chat e si inviano messaggi di chat tramite notifiche push, è inoltre necessario mantenere i messaggi di chat sul server. Se un utente fa clic su "Annulla" su qualsiasi notifica push, quel messaggio chat non verrà visualizzato sul dispositivo iOS. In tal caso, quando un'app viene visualizzata in primo piano in seguito, si effettua una chiamata al server e si recuperano tutti i messaggi chat precedenti (inviati tramite notifica push).

+0

Ciò che è certo è che le notifiche push non sono garantite per arrivare. Forse sto sprecando il mio tempo cercando di leggerli dal servizio di notifica, perché non posso anche essere sicuro che contenga tutte le informazioni che desidero. Comunque ho bisogno di sapere se c'è un modo per farlo, prima di scartare qualsiasi soluzione ... – Bartserk

+0

I tuoi sono corretti. Per quanto ne so, non c'è altra soluzione oltre al recupero dal lato server. –

1

Ok, quindi una possibile soluzione sarebbe avere un'altra tabella di database con i messaggi con un flag "read" e un campo messageID? Quale per impostazione predefinita il flag di lettura è NO, quindi quando l'app legge e visualizza correttamente, aggiorna il flag su SÌ?

E con solo 256 byte con cui giocare, che tipo di lunghezza del campo ID sarebbe necessaria?

Modifica,

eseguito questo piano e la sua opera con successo.

+0

Sì, questa è una buona soluzione :) È anche possibile correlare tale messaggio a una tabella "utente", e in questo modo è possibile creare un valore aggregato per verificare quanti messaggi non letti che l'utente ha.E, usando quel valore, sei in grado di aggiornare un proiettile in modo sicuro che era la mia preoccupazione principale quando ho scritto la domanda. Per quanto riguarda l'id, un buon valore numerico a 32 bit dovrebbe essere sufficiente a meno che tu non stia gestendo enormi quantità di informazioni :) – Bartserk

+0

Ive è andato per usare il token app e un ID messaggio come un modo per confrontare i messaggi, questo significa che posso basta usare un id breve e il token dovrebbe essere sufficiente per fermare le collisioni. –

+0

Devo dire che l'utilizzo del token dell'app come id è fortemente sconsigliato nella documentazione. Anche se funziona, più o meno, il token dell'app è più volatile di quanto non sembri in iOS. Potrebbe cambiare, ad esempio, con un aggiornamento del sistema operativo o un reset di fabbrica. Dovresti prendere in considerazione la possibilità di generare un altro tipo di ID relativo al dispositivo. – Bartserk

Problemi correlati