A meno di una settimana dall'articolo precedente, è già tempo per la rubrica #CrApple di tornare alla ribalta per denunciare l'ennesimo passo falso della casa di Cupertino: stavolta parliamo di XCode 8, l'ultima versione del blasonato (da chi?) framework di sviluppo software per iOS e OSX: strumento pressoché obbligato per sviluppare App, rigorosamente mono-piattaforma come la maggior parte delle suite targate Apple.
Una delle grandi innovazioni dell'ultima versione di XCode è data dalla nuova gestione dei cosiddetti Entitlements, i quali non sono altro che un ennesimo file da configurare per impostare - per l'ennesima volta - i permessi e le autorizzazioni che decidiamo di assegnare alla nostra app. Non bastano le impostazioni sui portali Developers Portal e su iTunes Connect, la configurazione dell'App ID, i Certificati di sviluppo e produzione, il Provisioning Profile, il Developer Profile e la Code-Signing Identity, oltre ovviamente alle impostazioni della App contenute nel file info.plist: si sentiva certamente la mancanza degli Entitlements. Di cosa si tratta? Del solito XML di chiavi/valori, ovviamente, compilato (male) automaticamente da XCode al momento del download del Provisioning Profile e quindi modificato (male) automaticamente man mano che lo sviluppatore modifica le impostazioni predefinite del Project e dei Targets della app.
Sarebbe bello limitarsi a dire che gli Entitlements sono inutili, ma purtroppo non è così: la realtà è che sono addirittura dannosi, poiché la presenza/assenza di determinate impostazioni - sulla base di criteri decisi arbitrariamente da Apple e che cambiano a seconda della versione di XCode - fa sì che determinate cose nella nostra App funzioneranno oppure no, anche se tutto il resto è impostato correttamente a livello di Certificati, App ID e Provisioning Profile. A farne le spese sono - come al solito - le notifiche push, vero e proprio tallone d'Achille del sistema iOS (come già spiegato in questo e in quest'altro articolo di questa rubrica): se non fossimo anche noi sviluppatori Apple proveremmo senz'altro una pena infinita per quei poveretti, costretti a rompersi la testa ad ogni nuovo rilascio di iOS, XCode, OSX - nonché di un nuovo iPhone o iPad - per via dei disastri che inevitabilmente provoca al servizio APNs... Purtroppo però lo siamo, cosa che ci porta a provare piuttosto una forte antipatia nei confronti di questi continui e reiterati disagi.
L'uscita di XCode 8 non fa certo eccezione: come sempre la nuova gestione degli Entitlements fa acqua da tutte le parti, essendo più macchinosa e ridondante della precedente e costringendo come di consueto lo sviluppatore a perdere un sacco di tempo nel tentativo di "divinare" i nuovi criteri arbirati stabiliti da Apple per far funzionare la baracca.
Riportiamo di seguito una delle tante testimonianze che si possono recuperare in rete, relativa a uno sviluppatore che si è trovato - per l'ennesima volta - con le notifiche non funzionanti a seguito dell'upgrade a XCode 8:
I have push notifications working on my app. I went to go submit a new app update and I ran into an error with APS environment not being set. I hit fix issue and it created the entitlement file with APS environment set to development. To submit the app I obviously want this set to production. I change the value to production and proceed to archive the app for submission. It throws an error in the capabilities section for push notifications with the last past "Add the Push Notifications entitlement to your entitlements file" being red. So when I hit fix issue, it then changes the value of APS environment to development. I came across a suggestion to inspect the provisioning profile and look for the APS environment property. I went through the process of archiving and selected "Upload to App Store". When I finally reached the summary, I clicked on the provisioning profile attached to the binary and entitlements. I open the provisioning profile in a text editor and looked for the APS environment property. I did find the property and it is set to production in the provision profile. I decided to try another suggestion, which was to recreate the distribution provisioning profile. I did make a new one and that solution doesn't work either. From what I understand the APS environment property is based on the value in your provisioning profile.
(link al thread originale sul forum ufficiale degli sviluppatori Apple)
Inutile dire che siamo più che solidali con questo sventurato sviluppatore, avendo vissuto in prima persona la medesima frustrazione.
Cosa hanno combinato stavolta? Ebbene, il misfatto può essere riassunto nel seguente modo: nel tentativo di venire incontro alle esigenze dello sviluppatore la casa di Cupertino ha introdotto un nuovo switch all'interno del tab Capabilities del Target principale di ciascuna App, il cui nome è, per l'appunto, Push Notifications.
Come possiamo facilmente immaginare, se questo switch è impostato su ON le notifiche push funzioneranno, in caso contrario no, a prescindere da qualsiasi impostazione, permesso o autorizzazione contenuta a livello di App ID, Certificati e Provisioning Profile. Si, avete capito bene: è stato aggiunto l'ennesimo blocco, l'ennesimo lucchetto di sicurezza a valle di tutto il già complicatissimo e ridondante sistema di autorizzazioni pre-esistente: ovviamente, neanche a dirlo, è stato implementato in modalità opt-in/default OFF, in modo da tagliare fuori chiunque non ne venga a conoscenza.
A questo punto, una domanda sorge spontanea: cosa succede quando pubblichiamo una App che utilizza le notifiche push ma che non possiede gli Entitlements necessari per utilizzarle? Verrebbe da pensare che qualcuno tra XCode, Application Loader e/o - quando tutto manca - il portale iTunes Connect di App Store si accorga che qualcosa va storto... oppure no?
Ovviamente, NO! La App viene accettata con successo, con tanto di e-mail automatica da parte dell'App Store Team che ringrazia per la submission:
Subito dopo, però, viene ricevuta anche un'altra e-mail che avverte che "potrebbe esserci qualche problema":
I latini erano soliti dire "aegrescit medendo": la cura è peggiore del male. Nonostante la e-mail parta bene, evidenziando correttamente come vi sia un problema a livello di Entitlement, le soluzioni proposte portano completamente fuori strada: non c'è infatti alcun problema a livello di App ID, di Provisioning Portal o di Provisioning Profile. il problema è nella nuova versione di XCode e del "nuovo" modo che ha di gestire gli Entitlements (vedi sopra): il motivo per cui viene inviata questa e-mail è legato unicamente al fatto che lo switch di cui sopra - contenuto nel tab Capabilities e relativo alle Push Notifications - è impostato su OFF: per risolvere il problema basterà impostarlo su ON.
Riassumendo: il portale di pubblicazione Apple accetta una App palesemente non funzionante, comunicando nel contempo allo sviluppatore che "potrebbe verificarsi un problema con le notifiche": il tutto senza avere la più pallida idea di quali possano essere le reali cause, al punto da avanzare una serie di ipotesi che non corrispondono al vero. Come se non bastasse, per risolvere il problema ci rimanda addirittura a un link non funzionante: se si prova infatti a fare click sulla Local and Push Notifications Programming Guide, la request cadrà preda di un complesso sistema di HTTP redirect che la porteranno... a un emblematico 404 - Page Not Found!
Come giudicare un'implementazione così dozzinale, superficiale e approssimativa, nonché totalmente irrispettosa dello sviluppatore? Di certo non è facile trovare i termini adatti per descriverla. Fortunatamente, però, possiamo contare su un'immagine che, ancora una volta, vale più di mille parole:
Ancora una volta è tutto: felice (si fa per dire) sviluppo, in attesa della prossima #CrApple - puntata!
Sto distribuendo un’app con la distribuzione enterprise….con l’ultima release di questa estate le notifiche funzionavano perfettamente
Ora ho rilasciato con XCode 8.1, nonostante lo switch acceso e la stringa “development” nelle Entitlements le notifiche partono ma non arrivano.
Se trovo una soluzione la scrivo o se qualcuno ha idee mi farebbe un favore
aggiorno: con l’app in debug le notifiche vengono ricevute, appena compilo e installo dall’ipa compilato smettono di funzionare…
A me funzionavano in debug e in versione Ad-Hoc, mentre non erano funzionanti in release. Ho risolto come descritto dall’articolo (tab Capabilities di XCode). Sei sicuro di averlo controllato?