Come funzionano le notifiche push di iOS?


98

In che modo le notifiche "push" di iOS vengono inviate a un particolare dispositivo senza che quel dispositivo debba interrogare un server?

Ad esempio, diciamo che ho ricevuto un nuovo messaggio su Facebook. Facebook notifica ad Apple che il mio dispositivo dovrebbe ricevere una notifica in quanto tale. Ma come fa Apple a sapere su quale dispositivo / IP inviare il messaggio?


2
@Wain sto cercando una spiegazione dettagliata a livello tecnico. Quell'articolo è di altissimo livello. Quindi il mio dispositivo mantiene sempre una connessione aperta con i server push di Apple?
Andy Hin

Ho più familiarità con Android Push, ma in genere, quando installi l'app, registra il dispositivo con un ID univoco con Apple. Quindi, quando Facebook invia un messaggio a Apple, Apple lo inoltrerà all'ID univoco del dispositivo.
Panama Jack

6
@ Pjack sì, ma con il mio dispositivo che cambia costantemente diverse torri cellulari, diverse reti wifi, come fa Apple a conoscere l'IP del mio ID univoco?
Andy Hin

@whydna Grazie per aver posto questa domanda. Volevo capire esattamente la stessa cosa. Credo che questo risponda alla mia domanda qui: stackoverflow.com/questions/18859732/…
MightyMouse

@AndyHin Il sistema operativo del dispositivo (iOS) sa quali server APN sono validi. Il dispositivo si sta connettendo a questi server e mantiene aperta una connessione. Questa connessione è probabilmente associata all'ID del dispositivo e ad altri metadati (numero di telefono). Quando un messaggio deve essere "inviato", l'APN trova la connessione giusta e la invia a quella connessione già aperta. Quindi gli APN non tentano di stabilire una connessione a un dispositivo, è sempre il dispositivo che apre quella connessione. Una connessione per dispositivo.
Todd

Risposte:


49

Era troppo per me inserire un commento così.

Dalla documentazione.

Il servizio Apple Push Notification (APN) propaga le notifiche push ai dispositivi con applicazioni registrate per ricevere tali notifiche. Ogni dispositivo stabilisce una connessione IP accreditata e crittografata con il servizio e riceve notifiche su questa connessione persistente. I provider si connettono agli APN tramite un canale persistente e sicuro monitorando i dati in entrata destinati alle loro applicazioni client. Quando arrivano nuovi dati per un'applicazione, il provider prepara e invia una notifica tramite il canale agli APN, che invia la notifica al dispositivo di destinazione.

Suggerisco di leggere la documentazione per ulteriori informazioni e su come utilizzare e configurare. È tutto lì.

Notifiche push


Grazie per la risposta.
MightyMouse

7
Quindi Apple mantiene un IP statico sul tuo dispositivo?
CMCDragonkai

Mi sono chiesto quando ho capito che il mio server deve inviare una notifica ad APNS PER OGNI DISPOSITIVO DI TARGET! :(
Vladimir

4
@CMCDragonkai Il dispositivo stabilisce la connessione, non il server.
Hitechcomputergeek

7
quindi i dispositivi mantengono un lungo tipo di connessione polling / socket sempre con il servizio APN? In tal caso, in che modo il servizio APN gestisce così tante connessioni? Se un server può contenere 50.000 connessioni e ci sono sempre 500 milioni di utenti, il servizio necessita almeno di 10000 server. È uno scenario pratico?
AV94

87

Ogni dispositivo può essere aggiornato con i dati utilizzando i propri token dispositivo univoci. Questa immagine spiega tutto. .

inserisci qui la descrizione dell'immagine


Qualche idea su cosa sia l'utilizzo del token del dispositivo? Viene utilizzato per crittografare la comunicazione tra il server APNS e l'app o altrove?
Mugen

1
@ Mugen: il token del dispositivo viene utilizzato da APNS per identificare quale dispositivo deve inoltrare il payload inviato dal provider!
D4ttatraya

@Karan - Esiste una distinzione tra le notifiche che sono per un utente (ad es. "Ehi utente, hai un messaggio!") E quelle che hanno lo scopo di riattivare un'app e dirle silenziosamente di eseguire un'elaborazione in background?
Howiecamp

@Howiecamp Se utilizzi la notifica push, riceverai una notifica ogni volta che viene ricevuta una notifica se l'app è in esecuzione. Anche i dettagli della notifica attiva sono accessibili, quando l'utente tocca la notifica dal centro notifiche e avvia l'app. Durante questo periodo puoi eseguire i processi che desideri eseguire.
Karan Alangat

@KaranAlangat, come viene gestito il conteggio dei badge qui? Come lo sa il server?
GvSharma

22

Ho creato un'infografica per spiegare il flusso di lavoro delle notifiche push. Spero che questo sia utile.

inserisci qui la descrizione dell'immagine


22

Panoramica degli APN

Il servizio Apple Push Notification (APN) è il fulcro della funzionalità di notifiche remote. È un servizio robusto, sicuro e altamente efficiente per gli sviluppatori di app per propagare le informazioni ai dispositivi iOS (e, indirettamente, watchOS), tvOS e macOS.

All'avvio iniziale della tua app sul dispositivo di un utente, il sistema stabilisce automaticamente una connessione IP accreditata, crittografata e permanente tra la tua app e gli APN. Questa connessione consente alla tua app di eseguire la configurazione per consentirle di ricevere notifiche, come spiegato in Configurazione del supporto per le notifiche remote.

L'altra metà della connessione per l'invio di notifiche, il canale sicuro e persistente tra un server provider e gli APN, richiede la configurazione nel tuo account sviluppatore online e l'uso di certificati crittografici forniti da Apple. Un provider è un server, che distribuisci e gestisci, che configuri per funzionare con gli APN. La Figura 1-1 mostra il percorso di consegna di una notifica remota.

Figura 1-1 Consegna di una notifica remota da un provider a un'app

immagine: ../Art/remote_notif_simple.jpg

Una volta completata la configurazione delle notifiche push sui tuoi provider e nella tua app, i tuoi provider possono quindi inviare richieste di notifica agli APN. Gli APN trasmettono i payload di notifica corrispondenti a ciascun dispositivo mirato. Alla ricezione di una notifica, il sistema consegna il payload all'app appropriata sul dispositivo e gestisce le interazioni con l'utente.

Se una notifica per la tua app arriva con il dispositivo acceso ma con l'app non in esecuzione, il sistema può comunque visualizzare la notifica. Se il dispositivo è spento quando gli APN inviano una notifica, gli APN trattengono la notifica e riprovano in un secondo momento (per i dettagli, vedere Notifiche di qualità del servizio, Store-and-Forward e Coalesced).

Responsabilità del fornitore

I server del tuo provider hanno le seguenti responsabilità per la partecipazione con gli APN:

  • Ricevere, tramite APN, token di dispositivo specifici per app univoci a livello globale e altri dati rilevanti dalle istanze della tua app sui dispositivi degli utenti. Ciò consente a un provider di conoscere ogni istanza in esecuzione della tua app.
  • Determinare, in base alla progettazione del sistema di notifica, quando è necessario inviare notifiche remote a ciascun dispositivo.
  • Creazione e invio di richieste di notifica agli APN, ciascuna richiesta contenente un carico utile di notifica e informazioni sulla consegna; Gli APN inviano quindi le notifiche corrispondenti ai dispositivi previsti per tuo conto.

Per ogni richiesta di notifica remota inviata da un provider, deve:

  • Costruisci un dizionario JSON contenente il payload della notifica, come descritto in Creazione del payload della notifica remota.
  • Aggiungi il payload, un token del dispositivo univoco a livello globale e altre informazioni di consegna a una richiesta HTTP / 2. Per informazioni sui token del dispositivo, vedere Attendibilità della connessione da APN a dispositivo e Token del dispositivo. Per informazioni sul formato della richiesta HTTP / 2 e sulle possibili risposte ed errori degli APN, vedere Comunicazione con gli APN.
  • Invia la richiesta HTTP / 2 agli APN, comprese le credenziali crittografiche sotto forma di token o certificato, su un canale sicuro e persistente.
  • La definizione di questo canale protetto è descritta in Architettura di sicurezza.

Utilizzo di più provider

La Figura 1-2 mostra il tipo di rete virtuale abilitata dagli APN per i dispositivi che eseguono le tue app. Per gestire il carico di notifiche, in genere distribuisci più provider, ciascuno con la propria connessione persistente e sicura agli APN. Ogni provider può quindi inviare richieste di notifica indirizzate a qualsiasi dispositivo per il quale il provider dispone di un token di dispositivo valido.

Figura 1-2 Invio di notifiche remote da più provider a più dispositivi

immagine: ../Art/remote_notif_multiple.jpg

Notifiche di qualità del servizio, Store-and-Forward e Coalesced

Il servizio Apple Push Notification include un componente Quality of Service (QoS) che esegue una funzione di memorizzazione e inoltro. Se gli APN tentano di recapitare una notifica e il dispositivo di destinazione è offline, gli APN memorizzano la notifica per un periodo di tempo limitato e la recapitano quando il dispositivo diventa nuovamente disponibile. Questo componente memorizza solo la notifica più recente per dispositivo e per app. Se un dispositivo è offline, l'invio di una richiesta di notifica indirizzata a quel dispositivo causa l'eliminazione della richiesta precedente. Se un dispositivo rimane offline per molto tempo, tutte le notifiche memorizzate negli APN vengono eliminate.

Per consentire l'unione di notifiche simili, è possibile includere un identificatore di compressione all'interno di una richiesta di notifica. Normalmente, quando un dispositivo è online, ogni richiesta di notifica inviata agli APN si traduce in una notifica consegnata al dispositivo. Tuttavia, quando la chiave apns-collapse-id è presente nell'intestazione della richiesta HTTP / 2, gli APN riuniscono le richieste il cui valore per quella chiave è lo stesso. Ad esempio, un servizio di notizie che invia lo stesso titolo due volte potrebbe utilizzare lo stesso valore dell'identificatore di compressione per entrambe le richieste. Gli APN unirebbero quindi le due richieste in un'unica notifica per la consegna al dispositivo. Per i dettagli sulla chiave apns-collapse-id.

Architettura di sicurezza

Gli APN applicano la convalida e l'autenticazione crittografica end-to-end utilizzando due livelli di attendibilità: attendibilità della connessione e attendibilità del token del dispositivo.

L'attendibilità della connessione funziona tra provider e APN e tra APN e dispositivi.

L'attendibilità del token del dispositivo funziona end-to-end per ogni notifica remota. Assicura che le notifiche vengano instradate solo tra i punti di inizio (fornitore) e di fine (dispositivo) corretti.

Un token del dispositivo è un'istanza NSData opaca che contiene un identificatore univoco assegnato da Apple a un'app specifica su un dispositivo specifico. Solo gli APN possono decodificare e leggere il contenuto di un token del dispositivo. Ogni istanza dell'app riceve il proprio token di dispositivo univoco quando si registra con gli APN e deve quindi inoltrare il token al proprio provider, come descritto in Configurazione del supporto per le notifiche remote. Il provider deve includere il token del dispositivo in ogni richiesta di notifica push che ha come destinazione il dispositivo associato; Gli APN utilizzano il token del dispositivo per garantire che la notifica venga recapitata solo alla combinazione univoca app-dispositivo per la quale è destinata.

Gli APN possono emettere un nuovo token del dispositivo per una serie di motivi:

  • L'utente installa la tua app su un nuovo dispositivo
  • L'utente ripristina il dispositivo da un backup
  • L'utente reinstalla il sistema operativo
  • Altri eventi definiti dal sistema

Di conseguenza, le app devono richiedere il token del dispositivo all'avvio, come descritto in Attendibilità della connessione da APN a dispositivo e token del dispositivo. Per esempi di codice, vedere Registrazione per ricevere notifiche remote.

Per stabilire sessioni TLS basate su HTTP / 2 con APN, è necessario assicurarsi che un certificato radice GeoTrust Global CA sia installato su ciascuno dei provider. Se un provider esegue macOS, questo certificato radice si trova nel portachiavi per impostazione predefinita. Su altri sistemi, questo certificato potrebbe richiedere un'installazione esplicita. È possibile scaricare questo certificato dal sito Web GeoTrust Root Certificates. Ecco un collegamento diretto al certificato.

La Figura 1-3 illustra l'utilizzo dell'API del provider APN basato su HTTP / 2 per stabilire l'attendibilità e l'utilizzo dei token di autenticazione del provider JWT per l'invio di notifiche.

Figura 1-3 Stabilire e utilizzare l'attendibilità della connessione del provider basata su token

immagine: ../Art/service_provider_ct.jpg

Come mostrato nella Figura 1-3, l'attendibilità del provider basato su token funziona come segue:

Il tuo provider richiede una connessione sicura con gli APN utilizzando TLS (Transport Layer Security), rappresentata dalla freccia con l'etichetta "TLS initiation" nella figura.

Gli APN quindi forniscono al tuo provider un certificato APN, rappresentato dalla freccia successiva nella figura (etichettato "certificato APNs"), che il tuo provider convalida.

A questo punto, viene stabilita l'attendibilità della connessione e il server del provider è abilitato a inviare richieste di notifica push remote basate su token agli APN. Ogni richiesta di notifica inviata dal tuo provider deve essere accompagnata da un token di autenticazione JWT, rappresentato nella figura come la freccia con l'etichetta "Notification push".

Gli APN rispondono a ogni push, rappresentati nella figura come la freccia con l'etichetta "Risposta HTTP / 2".

Per informazioni specifiche sulle risposte che il provider può ricevere per questo passaggio, vedere Risposta HTTP / 2 dagli APN.

La Figura 1-4 illustra l'uso di un certificato SSL emesso da Apple per stabilire la fiducia tra un provider e gli APN. A differenza della figura 1-3, questa figura non mostra un push di notifica in sé, ma si interrompe quando viene stabilita una connessione TLS (Transport Layer Security). Nello schema di attendibilità basato su certificato, le richieste di notifica push non vengono autenticate ma vengono convalidate utilizzando il token del dispositivo associato.

Figura 1-4 Stabilire l'attendibilità della connessione del provider basata su certificato

immagine: ../Art/service_provider_ct_certificate_2x.png

Come mostrato nella Figura 1-4, l'attendibilità da provider ad APN basata su certificati funziona come segue:

Il tuo provider richiede una connessione sicura con gli APN utilizzando TLS (Transport Layer Security), rappresentata dalla freccia con l'etichetta "TLS initiation" nella figura.

Gli APN quindi forniscono al tuo provider un certificato APN, rappresentato dalla freccia successiva nella figura (etichettato "certificato APNs"), che il tuo provider convalida.

Il tuo provider deve quindi inviare il suo certificato di provider fornito da Apple (che hai precedentemente ottenuto dal tuo account di sviluppatore online, come spiegato in "Generare un certificato SSL client APN universale" nella Guida di Xcode) agli APN, rappresentato come la freccia etichettata "Provider certificato."

Gli APN quindi convalidano il certificato del tuo provider, confermando così che la richiesta di connessione ha avuto origine da un provider legittimo e stabiliscono la tua connessione TLS.

A questo punto, viene stabilita l'attendibilità della connessione e il server del provider è abilitato a inviare richieste di notifica push remote basate su certificato agli APN.

Attendibilità della connessione da APN a dispositivo e token del dispositivo

L'affidabilità tra gli APN e ogni dispositivo viene stabilita automaticamente, senza la partecipazione della tua app, come descritto in questa sezione.

Ogni dispositivo ha un certificato crittografico e una chiave crittografica privata, forniti dal sistema operativo all'attivazione iniziale del dispositivo e memorizzati nel portachiavi del dispositivo. Durante l'attivazione, gli APN autenticano e convalidano la connessione al dispositivo, in base al certificato e alla chiave, come mostrato nella Figura 6-5.

Figura 1-5 Stabilire l'attendibilità della connessione tra un dispositivo e gli APN

immagine: ../Art/service_device_ct.jpg

Come mostrato nella Figura 1-5, l'attendibilità da APN a dispositivo funziona come segue:

  • La negoziazione della fiducia inizia quando il dispositivo avvia una connessione TLS con gli APN, come mostrato nella freccia in alto nella figura.
  • APN restituisce un certificato APN al dispositivo.
  • Il sistema operativo convalida questo certificato e quindi, come mostrato nella freccia "Certificato dispositivo", invia il certificato del dispositivo agli APN.
  • Infine, come indicato dalla freccia in basso in figura, gli APN convalidano il certificato del dispositivo, stabilendo la fiducia.
  • Con una connessione TLS stabilita tra gli APN e il dispositivo, le app sul dispositivo possono registrarsi con gli APN per ricevere i token del dispositivo specifici dell'app per le notifiche remote. Per dettagli ed esempi di codice, vedere Registrazione per ricevere notifiche remote in Configurazione del supporto per le notifiche remote.

Dopo aver ricevuto il token del dispositivo, un'app deve connettersi al provider associato dell'app e inoltrarvi il token. Questo passaggio è necessario perché un provider deve includere il token del dispositivo in un secondo momento quando invia una richiesta di notifica agli APN, indirizzando il dispositivo. Il codice che scrivi per inoltrare il token viene mostrato anche in Registrazione per ricevere notifiche remote.

Sia che un utente stia attivando un dispositivo per la prima volta o che gli APN abbiano emesso un nuovo token dispositivo, il processo è simile ed è mostrato nella Figura 6-6.

Figura 1-6 Gestione del token del dispositivo

immagine: ../Art/token_generation.jpg

L'ottenimento e la gestione di un token dispositivo specifico per app funziona come segue:

La tua app si registra con gli APN per le notifiche remote, come mostrato nella freccia in alto. Se l'app è già registrata e il token del dispositivo specifico dell'app non è cambiato, il sistema restituisce rapidamente il token esistente all'app e questo processo salta al passaggio 4.

Quando è necessario un nuovo token del dispositivo, gli APN ne generano uno utilizzando le informazioni contenute nel certificato del dispositivo. Crittografa il token utilizzando una chiave token e lo restituisce al dispositivo, come mostrato nella freccia centrale rivolta verso destra.

Il sistema restituisce il token del dispositivo alla tua app chiamando la tua applicazione: didRegisterForRemoteNotificationsWithDeviceToken: delegate method.

Dopo aver ricevuto il token, l'app (all'interno del metodo delegato) deve inoltrarlo al provider in formato binario o esadecimale. Il tuo provider non può inviare notifiche al dispositivo senza questo token. Per i dettagli, vedere Registrazione per ricevere notifiche remote in Configurazione del supporto per le notifiche remote.

IMPORTANTE

I token del dispositivo APN sono di lunghezza variabile. Non codificare la loro dimensione.

Quando il tuo provider invia una richiesta di notifica push agli APN, include un token del dispositivo che identifica una combinazione univoca app-dispositivo. Questo passaggio è mostrato nella freccia "Token, Payload" tra il provider e gli APN nella Figura 6-7. Gli APN decrittografano il token per garantire la validità della richiesta e per determinare il dispositivo di destinazione. Se gli APN determinano che il mittente e il destinatario sono legittimi, invia la notifica al dispositivo identificato.

Figura 1-7 Percorso di notifica remota dal provider al dispositivo

immagine: ../Art/token_trust.jpg

Dopo che il dispositivo ha ricevuto la notifica (e dopo il passaggio finale mostrato nella Figura 1-7), il sistema inoltra la notifica remota all'app.

Rif: Apple Push Notification Service

Ora, guarda qui per capire il flusso tecnico: come implementare il servizio di notifica push di Apple sull'applicazione iOS?


7
Haha, hai letteralmente incollato l'intera voce di Apple Docs in SO!
Matt Mc

@ MattMc - Sì, ero alle prime armi per SO, quando ho pubblicato questa risposta e in quel momento ho pubblicato un collegamento ad APNS ma un collegamento non è considerato una risposta su SO, quindi l'ho fatto .... :)
Krunal

1
In realtà è vero, molto meglio della risposta just-a-link;)
Matt Mc

14

Il dispositivo non continua a eseguire il polling del server per le notifiche push.

Per mantenerlo semplice, considera che un iPhone è connesso a Internet. Quando ci si connette a Internet, l'iPhone stabilisce la connessione al server delle notifiche push di Apple, questa connessione è una connessione aperta, il che significa che i dati possono essere inviati a iPhone dal server nel momento in cui i dati arrivano al server.

Apple non utilizza il protocollo HTTP per le notifiche push, ma se comprendi il protocollo HTTP è quasi una metodologia simile.

http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push


Cosa usano se non http?
Howiecamp

2

C'è davvero una bella spiegazione delle notifiche push in questo articolo .

In iOS, le app non possono fare molto in background. Le app possono svolgere solo una serie limitata di attività in modo da preservare la durata della batteria.

Ma cosa succede se succede qualcosa di interessante e desideri comunicarlo all'utente, anche se non sta attualmente utilizzando la tua app?

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.