Push Notifications Reset: come resettare le notifiche push su iPhone e iPad

EDIT: Se il problema con le Notifiche Push si è verificato in conseguenza dell’aggiornamento a XCode 8, leggi questo articolo per risolvere.

Non è passato molto tempo dal lungo articolo sulle assurdità degli strumenti di sviluppo Apple e relativi portali, il quale – al di là di un paio di polemiche portate avanti da qualche irriducibile fanboy Apple – è stato particolarmente apprezzato dai nostri lettori: è a loro che dedichiamo questo secondo approfondimento sulle carenze funzionali del sistema ideato dall’azienda di Cupertino per la pubblicazione e distribuzione delle App: oggi, per la gioia di molti, parleremo di notifiche push. Prima di affrontare l’argomento è il caso di chiedersi se non sarebbe opportuno creare una rubrica apposita per questo tipo di post. Butto lì alcune idee per un possibile titolo:

  • I Bachi della Mela
  • Torsoli di Mela
  • CrApple (questo funziona anche come hashtag)

Quale vi piace di più? Se avete qualche altro suggerimento, lasciatelo nei commenti: nel frattempo, veniamo al tema del giorno.

Chiunque abbia uno smartphone (e meno di 90 anni) ha quasi certamente una idea più o meno vaga e astratta di cosa sono le notifiche push: per semplificare, ci limiteremo a dire che si tratta di un sistema di comunicazione gestito da un servizio collegato all’azienda che fornisce il sistema operativo dello smarpthone in questione – Google per i device Android, RIM (oggi BlackBerry Limited) per i Blackberry e Apple per gli iPhone/iPad – il quale può essere utilizzato da un server di terze parti opportunamente autorizzato per inviare dei brevi pacchetti di dati ai dispositivi che hanno installato una determinata App, a patto che quest’ultima sia stata autorizzata a riceverli. A seconda di come funziona la App questi pacchetti di dati possono contenere messaggi inviati da altri utenti (Whatsapp, Skype), aggiornamenti di stato (news, articoli, blog, etc.), richieste di amicizia o di contatto (Meetic, Tinder) e così via.

Quella che segue è una sintesi del funzionamento del servizio APNs messo a disposizione da Apple per la gestione delle Notifiche Push (Push Notifications in lingua inglese) da parte delle applicazioni iOS:

Apple Push Notification service (APNs) propagates push notifications to devices having applications registered to receive those notifications. Each device establishes an accredited and encrypted IP connection with the service and receives notifications over this persistent connection. Providers connect with APNs through a persistent and secure channel while monitoring incoming data intended for their client applications. When new data for an application arrives, the provider prepares and sends a notification through the channel to APNs, which pushes the notification to the target device.

Per maggiori informazioni sul servizio APNs rimandiamo al dettagliato articolo presente nella documentazione ufficiale. In questa sede, come del resto abbiamo già spiegato in questo articolo, ci limiteremo a ricordare che utilizzare APNs costringe lo sviluppatore a compiere numerose attività:

  • Creare un certificato specifico per le Notifiche Push (tramite il Developer Portal).
  • Abilitare la App al supporto delle Notifiche Push e collegare il certificato di cui sopra (sempre tramite il Developer Portal).
  • Creare un Provisioning Profile e collegarlo all’App ID relativo alla app di cui sopra (sempre tramite il Developer Portal).
  • Implementare un pò di controlli/eventi/trigger all’interno del codice sorgente della App (tramite XCode).

A parte l’intrinseca assurdità del Provisioning Profile, che serve unicamente a consentire alla Apple di mantenere il controllo assoluto sulle modalità di distribuzione delle App, si tratta di passaggi che hanno una loro logica.

Vediamo cosa accade a livello di client, ovvero di iPhone: l’utente scarica la App e, al momento di installarla, accetta – tramite un apposito popup di conferma – di consentire a quest’ultima di ricevere notifiche. In caso affermativo, quel determinato iPhone viene inviato al servizio di notifiche APNs, il quale provvede a generare un ID univoco e a registrarlo come possibile punto di destinazione delle notifiche relative a quella determinata app. L’ID univoco viene solitamente restituito al telefono e da questo inviato immediatamente – solitamente tramite web service HTTP – al server/servizio collegato alla App che si occupa, direttamente o tramite servizi di terze parti, dell’invio effettivo delle notifiche.

Tutto bene, no? Beh, non proprio: il diavolo, si sa, è nei dettagli, ed è proprio lì che si annidano le idiosincrasie del sistema Apple. Nello specifico, il problema che abbiamo riscontrato risiede nella particolare modalità con cui la app chiede all’utente l’autorizzazione a inviare/ricevere notifiche, ovvero a comunicare la propria esistenza al servizio APNs. Questa richiesta avviene tramite il seguente popup:

apns-notifications-popup

 

Accettare o rifiutare questa richiesta significa, rispettivamente, consentire o meno all’applicazione l’utilizzo del servizio di notifiche del nostro iPhone. Una volta effettuata la scelta è ovviamente possibile cambiare idea andando nelle impostazioni del telefono e da lì nel centro notifiche, dove è custodito un elenco di tutte le app per le quali abbiamo effettuato questa scelta, con un pratico switch che consente di passare da Allow (Consenti) a Deny (Nega).

Il problema che abbiamo riscontrato nasce quando, per qualsivoglia motivo, abbiamo bisogno di resettare le impostazioni di notifica per una app, ovvero eliminare la entry nel centro notifiche e provocare nuovamente la comparsa del popup di cui sopra. Si tratta di una necessità non molto comune ma che può rivelarsi utile per ripristinare una app che non funziona correttamente, magari a seguito di un aggiornamento di iOS o dell’app stessa.

L’utente che abbia bisogno di effettuare questo reset scoprirà amaramente che:

  • Il centro notifiche non consente l’eliminazione della entry relativa a una app.
  • Disinstallare e reinstallare la app provocherà, rispettivamente, la scomparsa e la ricomparsa della relativa entry, senza provocare il ritorno del popup.

Il secondo punto risulta particolarmente inquietante: come mai l’iPhone/iPad tiene in memoria le impostazioni di notifica di una app che abbiamo scelto di disinstallare? La risposta, fortunatamente, può essere facilmente recuperata in rete grazie al sito StackOverflow: a quanto pare, l’iPhone/iPad mantiene le suddette impostazioni per le 24 ore successive alla disinstallazione. In conseguenza di questo, la procedura corretta per ripristinare le impostazioni di notifica è la seguente:

  1. Disinstallare la app dal dispositivo.
  2. Spegnere e riaccendere il dispositivo.
  3. Andare su Impostazioni > Generali > Data e Ora e modificare la data spostandola 1 giorno avanti (nel futuro) o più.
  4. Spegnere e riaccendere il dispositivo una seconda volta.

Fonte: http://stackoverflow.com/a/4080720/1233379

UPDATE: A quanto pare esistono casi/versioni di iOS in cui mandare la data avanti di un solo giorno potrebbe non essere sufficiente: questa risposta, sempre su StackOverflow, suggerisce di provare con un mese o più.

L’assurdità di tutto questo è evidente: i punti 2, 3 e 4 sono non soltanto completamente privi di logica, ma anche totalmente controintuitivi per qualsiasi utente medio: ci voleva tanto a eliminare quelle impostazioni al momento della disinstallazione, evitando tutto il resto?

Evidentemente si. Sia come sia, ancora una volta risulta evidente come la Apple dimostri di non avere alcun riguardo per gli utilizzatori dei propri dispositivi, costringendoli ad apprendere procedure inutili, irrazionali e inutilmente complicate.

Per il momento è tutto… fino alla prossima puntata di questa rubrica!

 

apple-sucks-trash-dog-shit

RELATED POSTS

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane.

View all posts by Ryan