{"id":9015,"date":"2012-06-11T16:39:02","date_gmt":"2012-06-11T14:39:02","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=9015"},"modified":"2012-09-10T11:58:51","modified_gmt":"2012-09-10T09:58:51","slug":"t110-come-implementare-le-push-notifications-con-easyapns","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t110-come-implementare-le-push-notifications-con-easyapns\/","title":{"rendered":"T#110 \u2013 Come implementare le Push Notifications con EasyAPNS"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-00.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-00.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-00\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-00\" width=\"120\" height=\"130\" class=\"alignleft size-full wp-image-9024\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-00.png 326w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-00-277x300.png 277w\" sizes=\"auto, (max-width: 120px) 100vw, 120px\" \/><\/a> In questo nuovo tutorial faremo un re-make del <a href=\"http:\/\/www.devapp.it\/wordpress\/t016-implementiamo-le-push-notifications.html\" target=\"_blank\">#T016<\/a> dove avevamo gi\u00e0 trattato l&#8217;argomento di <strong>come implementare le Push Notification nelle nostre applicazioni iPhone e iPad<\/strong>. Questa nuova guida \u00e8 aggiornata su Xcode 4.3.2 e usa le librerie PHP <strong>EasyAPNS<\/strong>.<\/p>\n<p>Ringraziamo lo sviluppatore <a href=\"http:\/\/www.megabri.com\/\" target=\"_blank\">Gabriele Merlonghi<\/a>, creatore delle applicazioni, <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/gps-alarm-pro\/id435336524?mt=8&#038;partnerId=2003\" target=\"_blank\">GPS Alarm Pro<\/a> e <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/ask-to-me!\/id454633939?l=it&#038;ls=1&#038;mt=8&#038;partnerId=2003\" target=\"_blank\">AskToMe!<\/a> (che potete trovare su App Store seguendo i link diretti) il quale ha scritto per noi questa utilissima guida.<!--more--><\/p>\n<h4>Come funzionano le notifiche push?<\/h4>\n<p>Ci sono 3 componenti essenziali su cui dovrete lavorare per far funzionare le notifiche push nella vostra applicazione iPhone:<\/p>\n<ol>\n<li>I profili e certificati dell&#8217;applicazione, che hanno abilitata la funzione Push Notification<\/li>\n<li>Un back-end su un vostro Web Server on line con PHP e MySQL<\/li>\n<li>Alcuni metodi dedicati alle Push Notification all&#8217;interno dell&#8217;AppDelegate.m dell&#8217;applicazione<\/li>\n<\/ol>\n<p>Il meccanismo delle notifiche push si basa sull&#8217;infrastruttura dell&#8217;Apple <strong>Push Notification Service<\/strong> che, nel corso del tutorial, chiameremo per comodit\u00e0 <strong>APNs<\/strong>. Esso consiste in un server di Apple denominato Push Notification Server (PNS) che fa da dispatcher di tutti i messaggi di notifica inviati a tutti i dispositivi iOS.<br \/>\nL&#8217;APNs consente al dispositivo iOS dell&#8217;utente di restare continuamente connesso con il PNS utilizzando una connessione TCP\/IP.<br \/>\nUna volta che il meccanismo \u00e8 funzionante, quando desideriamo inviare una notifica push alla nostra applicazione installata sul dispositivo dell&#8217;utente, dobbiamo contattare il servizio APNs di Apple affinch\u00e9 consegni il messaggio alla precisa applicazione installata sul dispositivo desiderato. <\/p>\n<p>Per rendere funzionante il dialogo con l&#8217;Apple Push Notification service (APNs), il nostro compito \u00e8 di scrivere un&#8217;applicazione su un nostro server che faccia da provider delle notifiche push e che comunichi proprio con tale server Apple. La nostra applicazione provider invier\u00e0 il messaggio al server APNs, che a sua volta recapiter\u00e0 il messaggio, attraverso la connessione TCP\/IP, a tutti i dispositivi che hanno la nostra applicazione installata e che hanno dato il consenso alla ricezione delle notifiche.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-01.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-01\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-01\" width=\"550\" height=\"483\" class=\"aligncenter size-full wp-image-9039\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-01.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-01-300x263.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-01-1024x899.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Facendo riferimento alla figura sopra in modo molto sintetico i principali passaggi che dovranno verificarsi sono:<\/p>\n<ol>\n<li>Sul terminale iOS dell&#8217;utente, quando verr\u00e0 lanciata l&#8217;app verr\u00e0 chiesto all&#8217;utente che questa intende inviargli delle notifiche. L&#8217;utente pu\u00f2 quindi accettare o rifiutare. Per andare avanti occorre ovviamente che accetti.<\/li>\n<li>Dopo l&#8217;accettazione dell&#8217;utente di cui al punto 1, c&#8217;\u00e8 uno scambio di messaggi tra iOS e l&#8217;APNs, che decretano la creazione del token. Questo viene inviato (insieme ad altre info del device) al database gestito con <strong>EasyAPNs<\/strong> sul vostro server. In questo modo il dispositivo iOS viene censito dal vostro server.<\/li>\n<li>Con le modalit\u00e0 e gli scopi che voi deciderete coerentemente con la vostra particolare App, il server si preoccuper\u00e0 di inviare al PNS una richiesta di messaggio di notifica verso uno o pi\u00f9 devices che sono censiti nel database di EasyAPNs.<\/li>\n<li>Il PNS si preoccuper\u00e0 fisicamente di consegnare la notifica sul o sui terminali iOS di destinazione.<\/li>\n<\/ol>\n<h4>Step 1: Creazione dei Certificati e Profili<\/h4>\n<p>Accedere all&#8217;iPhone Developer Program Portal ed andare nella sezione App IDs. Non \u00e8 possibile utilizzare un profilo con wild-card (ovvero con l&#8217;asterisco) per cui, se non avete gi\u00e0 un profilo senza wild-card, dovete crearne uno nuovo cliccando su &#8220;New App ID&#8221;. Il consiglio generale \u00e8 quello di usare un App ID distinto per ciascun&#8217;applicazione.<\/p>\n<p>Dopo aver creato l&#8217;App ID, cliccate su Configure e create il certificato SSL seguendo la procedura guidata (molto semplice). Al termine del procedimento, scaricate il certificato appena creato (file con estensione .cer).<\/p>\n<p>Ora dovete installare il certificato appena scaricato: doppio click su di esso e il certificato sar\u00e0 importato nel Portachiavi. Nel Portachiavi, andate nella categoria &#8220;I miei certificati&#8221; e noterete un certificato chiamato &#8220;Apple Development Push Services&#8221;. Cliccateci sopra col tasto destro del mouse e cliccate quindi su Esporta. Salvate il file con il nome <strong>apns-dev-cert.p12<\/strong>. Tornate al certificato &#8220;Apple Development Push Services&#8221; ed espandetelo cliccando sulla freccia grigia alla sua sinistra. Noterete una chiave, cliccateci sopra col tasto destro del mouse ed esportatela salvandola col nome <strong>apns-dev-key.p12<\/strong>.<\/p>\n<p>Aprite il terminale e posizionatevi nella cartella dove avete esportato i file sopra citati. Date i seguenti comandi, uno dopo l&#8217;altro (inserendo la password e la passphrase dove richiesto):<\/p>\n<pre>\r\nopenssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12\r\n \r\nopenssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12\r\n \r\nopenssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem\r\n \r\ncat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem\r\n<\/pre>\n<p>Tra tutti i file generati, a voi interessa il file <strong>apns-dev.pem<\/strong>, che dovrete caricare sul vostro server APNs (non preoccupatevi, lo vedremo nello step successivo). L&#8217;installazione dei certificati \u00e8 terminata. <\/p>\n<p>Ora dovete installare i profili. Tornate quindi nell&#8217;iPhone Developer Program Portal e andate nella sezione Provisioning. Create un nuovo profilo oppure (se esisteva gi\u00e0 prima) rigeneratelo per avere la funzione di Push Notification abilitata.<\/p>\n<p>Per caricarlo su Xcode, con la versione 4.3.2, \u00e8 sufficiente andare nell&#8217;Organizer, poi sulla sezione Devices, quindi in Library -> Provisioning Profiles ed infine cliccare sull&#8217;icona sull&#8217;angolo in basso a destra di Refresh. Vi verranno chieste le credenziali di accesso dell&#8217;Apple ID di sviluppo che possedete ed automaticamente Xcode si sincronizzer\u00e0 con tutti profili definiti sul portale Apple.<\/p>\n<p>Tutta questa procedura di creazione di certificati e profili va eseguita due volte: una per il development (per sviluppare e testate l&#8217;applicazione iOS) e l&#8217;altra per la distribution.<\/p>\n<h4>Step 2: Preparazione del Server con EasyAPNs<\/h4>\n<p>Per utilizzare le Notifiche Push nella vostra applicazione, dovete disporre di un vostro server remoto sempre accessibile, nel quale memorizzare il token dei vari dispositivi degli utenti e che si preoccuper\u00e0 di comunicare con il PNS di Apple per inviare i messaggi che vorrete.<\/p>\n<p><strong>La scelta dell&#8217;Hosting<\/strong><\/p>\n<p>Nelle mie prove ho utilizzato un Ubuntu Server domestico, ovviamente con Apache, PHP e MySQL installati, ma in produzione, ovviamente, occorre andare con un hosting apposito che dia delle garanzie di affidabilit\u00e0.<\/p>\n<p>Ci sono tantissime soluzioni di hosting di tutti i tipi e per tutte le tasche, ma c&#8217;\u00e8 un requisito molto importante che occorre tenere in considerazione da subito nella scelta dell&#8217;hosting per un APNs, ovvero: che supporti SSL. Questa caratteristica \u00e8 richiesta dalla tipologia di connessione che occorre stabilire tra il server APNs e il PNS di Apple, che ovviamente \u00e8 imposta da Apple stessa per garantire ad utenti e sviluppatori il corretto grado di sicurezza per un servizio di questo genere.<\/p>\n<p>Ho fatto un piccolo scouting di hosting gratuiti attraverso il motore di ricerca <a href=\"http:\/\/www.freehostsfinder.com\/\" target=\"_blank\">FreeHosting<\/a>, a questo <a href=\"http:\/\/www.freehostsfinder.com\/search.php?space=&#038;bw=&#038;your_ads=Yes&#038;php=Yes&#038;mysql=Yes&#038;ssi=Yes&#038;pages=1&#038;Submit=Search\" target=\"_blank\">link<\/a> trovate i risultati filtrati con il supporto a PHP, MySQL e SSL.<\/p>\n<p>Fate molta attenzione a quest&#8217;aspetto, perch\u00e9 su moltissimi servizi di hosting anche commerciali il supporto SSL non \u00e8 affatto scontato, anzi in base alle mie ricerche \u00e8 una caratteristica rara.<\/p>\n<p>Nel momento in cui questo tutorial \u00e8 stato scritto, sembrerebbe che <a href=\"http:\/\/freehostingnoads.net\/\" target=\"_blank\">FreeHostingNoAds<\/a> sia una possibile soluzione gratuita per ospitare un servizio APNs. Considerate che questa segnalazione non vuole avere uno scopo di soluzione assoluta, ciascun sviluppatore dovrebbe ricercare il corretto servizio di hosting in base alle proprie esigenze. Se possedete gi\u00e0 un dominio, prima di tutto fate una verifica se avete gi\u00e0 i requisiti necessari per APNs (che vi ricordo, sono il supporto a PHP, MySQL e SSL), in questo modo potrete utilizzare l&#8217;infrastruttura di hosting, che magari gi\u00e0 pagate senza dover fare nuove spese.<\/p>\n<p><strong>La scelta di EasyAPNs e la sua personalizzazione<\/strong><\/p>\n<p>A differenza di altre soluzioni open source EasyAPNs risalta per due punti che ritengo importanti:<\/p>\n<ol>\n<li>E&#8217; ben documentata e quindi facilmente personalizzabile.<\/li>\n<li>Integra gi\u00e0 una soluzione di database per i dispositivi che si registrano alle notifiche.<\/li>\n<\/ol>\n<p>Una volta terminati gli steps previsti da questo tutorial, l&#8217;unica cosa che rimane a carico dello sviluppatore \u00e8 quella di preoccuparsi di come triggerare il messaggio di notifica e su quali dispositivi (se a tutti o su alcuni in particolare) che ovviamente dipende moltissimo dalla natura dell&#8217;applicazione iOS specifica.<\/p>\n<p>EasyAPNs pu\u00f2 essere scaricato direttamente dal <a href=\"https:\/\/github.com\/manifestinteractive\/easyapns\" target=\"_blank\">repository su GitHub<\/a>.<\/p>\n<p>Nel momento in cui questo tutorial \u00e8 stato scritto, sono state trovate delle differenze tra i sorgenti online e la documentazione presente sul portale web <a href=\"http:\/\/www.easyapns.com\/\" target=\"_blank\">http:\/\/www.easyapns.com<\/a> anche per questo motivo \u00e8 nato questo tutorial. Mi riferisco in particolare alla parte di codice Objective-C che vedremo sullo step successivo.<\/p>\n<p>Ora concentriamoci sulla messa in opera del server ovvero sulla creazione del database de sulla parametrizzazione dei sorgenti in PHP.<\/p>\n<p>Nelle sezioni seguenti, si d\u00e0 per scontato sul server siano operativi i seguenti servizi:<\/p>\n<ul>\n<li>Apache2<\/li>\n<li>PHP<\/li>\n<li>MySQL<\/li>\n<li>SSL<\/li>\n<\/ul>\n<p>Nel caso questi pre-requisiti non fossero operativi si rimanda alla verifica di questi con il servizio di hosting oppure alla messa a punto di un LAMP server (una semplice guida <a href=\"http:\/\/www.linux-italia.it\/lamp-web-server\/\" target=\"_blank\">qui<\/a>) nel caso di un server di cui si ha la completa gestione (come potrebbe essere quello domestico).<\/p>\n<p>Nelle sezioni seguenti si fa riferimento all&#8217;esperienza su un Ubuntu Server domestico 12.04, ma valgono le stesse nozioni anche se si tratta di un servizio di hosting dedicato.<\/p>\n<p><strong>Preparazione del database MySQL<\/strong><\/p>\n<p>Per interagire in modo &#8220;umano&#8221; con il database di MySQL, si fa riferimento all&#8217;interfaccia web phpMyAdmin, nel caso non l&#8217;aveste gi\u00e0 disponibile sul vostro server si pu\u00f2 banalmente installare da shell con il comando:<\/p>\n<pre>\r\nsudo apt-get install phpmyadmin\r\n<\/pre>\n<p>Di default per accedere all&#8217;interfaccia \u00e8 sufficiente digitare da browser: <strong>http:\/\/localhost\/phpmyadmin<\/strong>.<\/p>\n<p>Vi rimando a <a href=\"http:\/\/php.html.it\/guide\/leggi\/78\/guida-phpmyadmin\/\" target=\"_blank\">questo interessante articolo<\/a> riguardante l&#8217;uso di questa interfaccia, ma per chi non la conosce gi\u00e0 premetto che \u00e8 molto intuitiva e non serve un manuale d&#8217;uso.<\/p>\n<p>Utilizzando il login di amministrazione del database su phpMyAdmin, creare un nuovo database, che per comodit\u00e0 chiameremo apns.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-031.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-031.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-03\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-03\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9040\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-031.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-031-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-031-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Creiamo una utenza che non avr\u00e0 i diritti di root, ma che si limita ad operare solo all&#8217;interno del database apns appena creato. Questo passaggio non \u00e8 essenziale, ma \u00e8 fortemente suggerito per evitare di scrivere le credenziali di accesso dell&#8217;utente di root nel codice PHP che di solito sono pi\u00f9 &#8220;riservate&#8221;.<\/p>\n<p>Selezionare il database apns appena creato sulla colonna di sinistra, selezionare il tab &#8220;Privilegi&#8221; e cliccare quindi su &#8220;Aggiungi un nuovo utente&#8221;.<\/p>\n<p>Nell&#8217;esempio seguente viene creato l&#8217;utente &#8220;testuser&#8221;, con password generata casualmente cliccando sul pulsante &#8220;Genera&#8221;.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-04.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-04\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-04\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9027\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-04.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-04-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-04-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><strong>Importante:<\/strong> salvarsi la password generata su blocco note per poterla poi indicare all&#8217;interno dei files PHP.<\/p>\n<p>Nella sezione relativa ai &#8220;Privilegi Globali&#8221;, lasciare tutte le spunte deselezionate, in questo modo non si dar\u00e0 alcun grant globale a questo utente.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-05.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-05\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-05\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9028\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-05.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-05-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-05-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Cliccare sul pulsante &#8220;Esegui&#8221; in fondo alla pagina per eseguire l&#8217;operazione.<\/p>\n<p>Ecco l&#8217;utente &#8220;testuser&#8221; comparire nell&#8217;elenco degli utenti di MySQL.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-06.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-06\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-06\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9029\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-06.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-06-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-06-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Eseguire lo script SQL di generazione della struttura delle tabelle che servono a EasyAPNS.<\/p>\n<p>Spostarsi sul tab SQL e copiare\/incollare il seguente codice:<\/p>\n<pre lang=\"sql\" line=\"1\" escaped=\"true\">\r\nSET FOREIGN_KEY_CHECKS=0;\r\n\r\nCREATE TABLE `apns_device_history` (\r\n  `pid` int(9) unsigned NOT NULL auto_increment,\r\n  `clientid` varchar(64) NOT NULL,\r\n  `appname` varchar(255) NOT NULL,\r\n  `appversion` varchar(25) default NULL,\r\n  `deviceuid` char(40) NOT NULL,\r\n  `devicetoken` char(64) NOT NULL,\r\n  `devicename` varchar(255) NOT NULL,\r\n  `devicemodel` varchar(100) NOT NULL,\r\n  `deviceversion` varchar(25) NOT NULL,\r\n  `pushbadge` enum('disabled','enabled') default 'disabled',\r\n  `pushalert` enum('disabled','enabled') default 'disabled',\r\n  `pushsound` enum('disabled','enabled') default 'disabled',\r\n  `development` enum('production','sandbox') character set latin1 NOT NULL default 'production',\r\n  `status` enum('active','uninstalled') NOT NULL default 'active',\r\n  `archived` datetime NOT NULL,\r\n  PRIMARY KEY  (`pid`),\r\n  KEY `clientid` (`clientid`),\r\n  KEY `devicetoken` (`devicetoken`),\r\n  KEY `devicename` (`devicename`),\r\n  KEY `devicemodel` (`devicemodel`),\r\n  KEY `deviceversion` (`deviceversion`),\r\n  KEY `pushbadge` (`pushbadge`),\r\n  KEY `pushalert` (`pushalert`),\r\n  KEY `pushsound` (`pushsound`),\r\n  KEY `development` (`development`),\r\n  KEY `status` (`status`),\r\n  KEY `appname` (`appname`),\r\n  KEY `appversion` (`appversion`),\r\n  KEY `deviceuid` (`deviceuid`),\r\n  KEY `archived` (`archived`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store unique device history';\r\n\r\nCREATE TABLE `apns_devices` (\r\n  `pid` int(9) unsigned NOT NULL auto_increment,\r\n  `clientid` varchar(64) NOT NULL,\r\n  `appname` varchar(255) NOT NULL,\r\n  `appversion` varchar(25) default NULL,\r\n  `deviceuid` char(40) NOT NULL,\r\n  `devicetoken` char(64) NOT NULL,\r\n  `devicename` varchar(255) NOT NULL,\r\n  `devicemodel` varchar(100) NOT NULL,\r\n  `deviceversion` varchar(25) NOT NULL,\r\n  `pushbadge` enum('disabled','enabled') default 'disabled',\r\n  `pushalert` enum('disabled','enabled') default 'disabled',\r\n  `pushsound` enum('disabled','enabled') default 'disabled',\r\n  `development` enum('production','sandbox') character set latin1 NOT NULL default 'production',\r\n  `status` enum('active','uninstalled') NOT NULL default 'active',\r\n  `created` datetime NOT NULL,\r\n  `modified` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,\r\n  PRIMARY KEY  (`pid`),\r\n  UNIQUE KEY `appname` (`appname`,`deviceuid`),\r\n  KEY `clientid` (`clientid`),\r\n  KEY `devicetoken` (`devicetoken`),\r\n  KEY `devicename` (`devicename`),\r\n  KEY `devicemodel` (`devicemodel`),\r\n  KEY `deviceversion` (`deviceversion`),\r\n  KEY `pushbadge` (`pushbadge`),\r\n  KEY `pushalert` (`pushalert`),\r\n  KEY `pushsound` (`pushsound`),\r\n  KEY `development` (`development`),\r\n  KEY `status` (`status`),\r\n  KEY `created` (`created`),\r\n  KEY `modified` (`modified`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Store unique devices';\r\n\r\nDELIMITER ;;\r\nCREATE TRIGGER `Archive` BEFORE UPDATE ON `apns_devices` FOR EACH ROW INSERT INTO `apns_device_history` VALUES (\r\n\tNULL,\r\n\tOLD.`clientid`,\r\n\tOLD.`appname`,\r\n\tOLD.`appversion`,\r\n\tOLD.`deviceuid`,\r\n\tOLD.`devicetoken`,\r\n\tOLD.`devicename`,\r\n\tOLD.`devicemodel`,\r\n\tOLD.`deviceversion`,\r\n\tOLD.`pushbadge`,\r\n\tOLD.`pushalert`,\r\n\tOLD.`pushsound`,\r\n\tOLD.`development`,\r\n\tOLD.`status`,\r\n\tNOW()\r\n);;\r\nDELIMITER ;\r\n\r\nCREATE TABLE `apns_messages` (\r\n  `pid` int(9) unsigned NOT NULL auto_increment,\r\n  `clientid` varchar(64) NOT NULL,\r\n  `fk_device` int(9) unsigned NOT NULL,\r\n  `message` varchar(255) NOT NULL,\r\n  `delivery` datetime NOT NULL,\r\n  `status` enum('queued','delivered','failed') character set latin1 NOT NULL default 'queued',\r\n  `created` datetime NOT NULL,\r\n  `modified` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,\r\n  PRIMARY KEY  (`pid`),\r\n  KEY `clientid` (`clientid`),\r\n  KEY `fk_device` (`fk_device`),\r\n  KEY `status` (`status`),\r\n  KEY `created` (`created`),\r\n  KEY `modified` (`modified`),\r\n  KEY `message` (`message`),\r\n  KEY `delivery` (`delivery`)\r\n) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Messages to push to APNS';\r\n<\/pre>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-07.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-07\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-07\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9030\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-07.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-07-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-07-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Quindi cliccare sul tasto ESEGUI. A questo punto avrete tutta la struttura gi\u00e0 perfettamente &#8220;adeguata&#8221;.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-08.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-08.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-08\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-08\" width=\"550\" height=\"446\" class=\"aligncenter size-full wp-image-9031\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-08.png 1052w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-08-300x243.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-08-1024x830.png 1024w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Niente di pi\u00f9 semplice vero?<\/p>\n<p>Potete trovare il file con lo script SQL a <a href=\"https:\/\/github.com\/manifestinteractive\/easyapns\/blob\/master\/src\/sql\/apns.sql\" target=\"_blank\">questo indirizzo<\/a>.<\/p>\n<p><strong>Personalizzazione dei sorgenti PHP<\/strong><\/p>\n<p>La struttura dei sorgenti di EasyPHP \u00e8 semplicissima ed \u00e8 brevemente descritta di seguito:<\/p>\n<p>Nella cartella &#8220;classes&#8221; sono presenti i files &#8220;class_APNS.php&#8221; e &#8220;class_DbConnect.php&#8221;, il primo file \u00e8 quello che esegue in realt\u00e0 quasi tutto il lavoro sporco, mentre il secondo si preoccupa di stabilire la connessione con il database.<\/p>\n<p>Nella cartella radice, invece, sono presenti i files &#8220;apns.php&#8221; e &#8220;samples.php&#8221;, il primo file \u00e8 quello che viene invocato dall&#8217;applicazione iOS quando si deve registrare il token del device, mentre il secondo racchiude una serie di esempi pratici su come si possono formare i messaggi di notifica verso i devices.<\/p>\n<p>Utilizzare un client FTP per trasferire i sorgenti PHP e i 2 certificati sul server remoto, nel nostro esempio &#8220;\/apns&#8221; rappresenta la cartella radice dei sorgenti (i certificati ed il file apns.php devono stare nella stessa cartella).<\/p>\n<p>I 2 certificati devono essere posti con i flag degli attributi a 644 per maggiore sicurezza. Questa impostazione \u00e8 obbligatoria, perch\u00e9 viene controllata all&#8217;interno del codice PHP, si pu\u00f2 fare direttamente via FTP oppure da riga di comando:<\/p>\n<pre>\r\nsudo chmod 644 apns-dev.pem\r\nsudo chmod 644 apns.pem\r\n<\/pre>\n<p>I files su cui eseguire le personalizzazioni sono &#8220;class_APNS.php&#8221; e &#8220;apns.php&#8221;.<\/p>\n<p>Su class_APNS.php vanno effettuati i seguenti interventi:<\/p>\n<ol>\n<li>Specificare il percorso assoluto del file di log\n<pre lang=\"php\" escaped=\"true\">private $logPath = '\/var\/www\/apns\/apns.log'; \/\/change this to your log absolute path<\/pre>\n<\/li>\n<li>Specificare il percorso assoluto del certificato di produzione\n<pre lang=\"php\" escaped=\"true\">private $certificate = '\/var\/www\/apns\/apns.pem'; \/\/change this to your production certificate absolute path<\/pre>\n<\/li>\n<li>Specificare il percorso assoluto del certificato di sviluppo\n<pre lang=\"php\" escaped=\"true\">private $sandboxCertificate = '\/var\/www\/apns\/apns-dev.pem'; \/\/change this to your development certificate absolute path<\/pre>\n<\/li>\n<\/ol>\n<p><strong>Nota:<\/strong> durante lo sviluppo e test class_APNS.php utilizza l&#8217;indirizzo del PNS Apple ssl:\/\/gateway.sandbox.push.apple.com:2195, mentre per la produzione viene utilizzato l&#8217;indirizzo ssl:\/\/gateway.push.apple.com:2195<\/p>\n<p>Su apns.php vanno indicati i parametri di connessione al database alla riga 43:<\/p>\n<pre lang=\"php\" escaped=\"true\">$db = new DbConnect('localhost', 'testuser', 'Gj4fMDyS7PduwPRp', 'apns');<\/pre>\n<p>Nel file samples.php ci sono diversi esempi di come poter inviare una notifica al database del server APNs, io ho preferito fare il test solo con un esempio alla volta. Riporto quello che ho usato io, ma potete scegliere voi liberamente quale utilizzare.<\/p>\n<pre lang=\"php\" line=\"1\" escaped=\"true\">\r\n<?PHP\r\n\/**\r\n * Begin Document\r\n *\/\r\n\r\n\/\/ AUTOLOAD CLASS OBJECTS... YOU CAN USE INCLUDES IF YOU PREFER\r\nif(!function_exists(\"__autoload\")){ \r\n\tfunction __autoload($class_name){\r\n\t\trequire_once('classes\/class_'.$class_name.'.php');\r\n\t}\r\n}\r\n\r\n\/\/ CREATE DATABASE OBJECT ( MAKE SURE TO CHANGE LOGIN INFO IN CLASS FILE )\r\n$db = new DbConnect('localhost', 'testuser', '3ShFXAf5z6YfVYQG', 'apns');\r\n$db->show_errors();\r\n\r\n\/\/ FETCH $_GET OR CRON ARGUMENTS TO AUTOMATE TASKS\r\n$apns = new APNS($db);\r\n\r\n\/**\r\n\/*\tACTUAL SAMPLES USING THE 'Examples of JSON Payloads' EXAMPLES (1-5) FROM APPLE'S WEBSITE.\r\n *\tLINK:  http:\/\/developer.apple.com\/iphone\/library\/documentation\/NetworkingInternet\/Conceptual\/RemoteNotificationsPG\/ApplePushService\/ApplePushService.html#\/\/apple_ref\/doc\/uid\/TP40008194-CH100-SW15\r\n *\/\r\n\r\n\/\/ APPLE APNS EXAMPLE 2\r\n$apns->newMessage(2, '2010-05-31 12:00:00'); \/\/ FUTURE DATE NOT APART OF APPLE EXAMPLE\r\n$apns->addMessageAlert('Questo \u00e8 un test di notifica push fatto da Gabriele Merlonghi', 'GUARDA');\r\n$apns->addMessageBadge(5);\r\n$apns->addMessageSound('chime');\r\n$apns->addMessageCustom('acme', 'foo');\r\n$apns->addMessageCustom('acme2', array('bang', 'whiz'));\r\n$apns->queueMessage();\r\n\r\n\/\/ SEND ALL MESSAGES NOW\r\n$apns->processQueue();\r\n?>\r\n<\/pre>\n<p>La programmazione lato server \u00e8 terminata, ora non resta che occuparci della parte client, ovvero la parte che riguarda la vostra applicazione iOS.<\/p>\n<h4>Step 3: Preparazione dell&#8217;applicativo iOS per registrarsi alle notifiche.<\/h4>\n<p>Un dettaglio importante da sapere \u00e8 che non \u00e8 possibile testare le notifiche push con il simulatore, queste possono funzionare solo sul device fisico.<\/p>\n<p>Premesso questo, ci sono tre cose fondamentali da fare nel progetto:<\/p>\n<ol>\n<li>Installare il profilo su Xcode e sul device di test<\/li>\n<li>Abilitare le notifiche push<\/li>\n<li>Prelevare il token del device ed inviarlo al server APNs precedentemente predisposto<\/li>\n<\/ol>\n<p>Nelle linee guida Apple si raccomanda di prelevare il token ogni volta che viene avviata l&#8217;applicazione. Questo perch\u00e9, in caso di ripristino del dispositivo, il token cambia, per cui se non viene aggiornato le notifiche push non arriveranno pi\u00f9 su quel device.<\/p>\n<p>Negli esempi seguenti si fa riferimento ad una versione modificata del progetto &#8220;Demo&#8221; che \u00e8 fornito in EasyAPNS.<\/p>\n<p><strong>Abilitazione delle notifiche push<\/strong><\/p>\n<p>Il meccanismo di abilitazione \u00e8 stato standardizzato da Apple e consiste nel tipico messaggio all&#8217;avvio dell&#8217;app che chiede all&#8217;utente:<\/p>\n<p>&#8220;<em>Questa applicazione vorrebbe inviarti delle notifiche: <Accettare> <Rifiutare><\/em>&#8221;<\/p>\n<p>Questo alert viene generato automaticamente da iOS, dopo che sul codice dell&#8217;app vengono scritte queste due righe di codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Add registration for remote notifications \r\n[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];\r\n\/\/ Clear application badge when app launches\r\napplication.applicationIconBadgeNumber = 0;\r\n<\/pre>\n<p>in un punto qualsiasi all&#8217;interno nel metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\r\n<\/pre>\n<p>di DemoAppDelegate.m<\/p>\n<p><strong>Prelevamento del token ed invio al server<\/strong><\/p>\n<p>Rimanendo ancora all&#8217;interno dello stesso file DemoAppDelegate.m, aggiungere le seguenti righe di codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/*\r\n * ---------------------------------------------------------------------\r\n *  BEGIN APNS CODE\r\n * ---------------------------------------------------------------------\r\n *\/\r\n\r\n\/**\r\n * Fetch and Format Device Token and Register Important Information to Remote Server\r\n *\/\r\n- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {\r\n    \r\n#if !TARGET_IPHONE_SIMULATOR\r\n    \r\n\tNSLog(@\"Did register for remote notifications: %@\", devToken);\r\n\r\n    \r\n\t\/\/ Get Bundle Info for Remote Registration (handy if you have more than one app)\r\n\tNSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@\"CFBundleDisplayName\"];\r\n\tNSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@\"CFBundleVersion\"];\r\n    \r\n\t\/\/ Check what Notifications the user has turned on.  We registered for all three, but they may have manually disabled some or all of them.\r\n\tNSUInteger rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];\r\n    \r\n\t\/\/ Set the defaults to disabled unless we find otherwise...\r\n\tNSString *pushBadge = @\"disabled\";\r\n\tNSString *pushAlert = @\"disabled\";\r\n\tNSString *pushSound = @\"disabled\";\r\n    \r\n\t\/\/ Check what Registered Types are turned on. This is a bit tricky since if two are enabled, and one is off, it will return a number 2... not telling you which\r\n\t\/\/ one is actually disabled. So we are literally checking to see if rnTypes matches what is turned on, instead of by number. The \"tricky\" part is that the\r\n\t\/\/ single notification types will only match if they are the ONLY one enabled.  Likewise, when we are checking for a pair of notifications, it will only be\r\n\t\/\/ true if those two notifications are on.  This is why the code is written this way\r\n\tif(rntypes == UIRemoteNotificationTypeBadge){\r\n\t\tpushBadge = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == UIRemoteNotificationTypeAlert){\r\n\t\tpushAlert = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == UIRemoteNotificationTypeSound){\r\n\t\tpushSound = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert)){\r\n\t\tpushBadge = @\"enabled\";\r\n\t\tpushAlert = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)){\r\n\t\tpushBadge = @\"enabled\";\r\n\t\tpushSound = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == ( UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)){\r\n\t\tpushAlert = @\"enabled\";\r\n\t\tpushSound = @\"enabled\";\r\n\t}\r\n\telse if(rntypes == ( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)){\r\n\t\tpushBadge = @\"enabled\";\r\n\t\tpushAlert = @\"enabled\";\r\n\t\tpushSound = @\"enabled\";\r\n\t}\r\n    \r\n\t\/\/ Get the users Device Model, Display Name, Unique ID, Token & Version Number\r\n\tUIDevice *dev = [UIDevice currentDevice];\r\n\tNSString *deviceUuid = dev.uniqueIdentifier;\r\n    NSString *deviceName = dev.name;\r\n\tNSString *deviceModel = dev.model;\r\n\tNSString *deviceSystemVersion = dev.systemVersion;\r\n    \r\n\t\/\/ Prepare the Device Token for Registration (remove spaces and < >)\r\n\tNSString *deviceToken = [[[[devToken description]\r\n                               stringByReplacingOccurrencesOfString:@\"<\"withString:@\"\"]\r\n                              stringByReplacingOccurrencesOfString:@\">\" withString:@\"\"]\r\n                             stringByReplacingOccurrencesOfString: @\" \" withString: @\"\"];\r\n    \r\n\t\/\/ Build URL String for Registration\r\n\t\/\/ !!! CHANGE \"www.mywebsite.com\" TO YOUR WEBSITE. Leave out the http:\/\/\r\n\t\/\/ !!! SAMPLE: \"secure.awesomeapp.com\"\r\n\tNSString *host = @\"www.mywebsite.com\";\r\n    \r\n\t\/\/ !!! CHANGE \"\/apns.php?\" TO THE PATH TO WHERE apns.php IS INSTALLED\r\n\t\/\/ !!! ( MUST START WITH \/ AND END WITH ? ).\r\n\t\/\/ !!! SAMPLE: \"\/path\/to\/apns.php?\"\r\n\tNSString *urlString = [@\"\/apns\/apns.php?\"stringByAppendingString:@\"task=register\"];\r\n    \r\n\turlString = [urlString stringByAppendingString:@\"&appname=\"];\r\n\turlString = [urlString stringByAppendingString:appName];\r\n\turlString = [urlString stringByAppendingString:@\"&appversion=\"];\r\n\turlString = [urlString stringByAppendingString:appVersion];\r\n\turlString = [urlString stringByAppendingString:@\"&deviceuid=\"];\r\n\turlString = [urlString stringByAppendingString:deviceUuid];\r\n\turlString = [urlString stringByAppendingString:@\"&devicetoken=\"];\r\n\turlString = [urlString stringByAppendingString:deviceToken];\r\n\turlString = [urlString stringByAppendingString:@\"&devicename=\"];\r\n\turlString = [urlString stringByAppendingString:deviceName];\r\n\turlString = [urlString stringByAppendingString:@\"&devicemodel=\"];\r\n\turlString = [urlString stringByAppendingString:deviceModel];\r\n\turlString = [urlString stringByAppendingString:@\"&deviceversion=\"];\r\n\turlString = [urlString stringByAppendingString:deviceSystemVersion];\r\n\turlString = [urlString stringByAppendingString:@\"&pushbadge=\"];\r\n\turlString = [urlString stringByAppendingString:pushBadge];\r\n\turlString = [urlString stringByAppendingString:@\"&pushalert=\"];\r\n\turlString = [urlString stringByAppendingString:pushAlert];\r\n\turlString = [urlString stringByAppendingString:@\"&pushsound=\"];\r\n\turlString = [urlString stringByAppendingString:pushSound];\r\n    \r\n\t\/\/ Register the Device Data\r\n\t\/\/ !!! CHANGE \"http\" TO \"https\" IF YOU ARE USING HTTPS PROTOCOL\r\n\tNSURL *url = [[NSURL alloc] initWithScheme:@\"http\" host:host path:urlString];\r\n    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];\r\n\tNSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];\r\n\tNSLog(@\"Register URL: %@\", url);\r\n\tNSLog(@\"Return Data: %@\", returnData);\r\n    \r\n#endif\r\n}\r\n\r\n\/**\r\n * Failed to Register for Remote Notifications\r\n *\/\r\n- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {\r\n    \r\n#if !TARGET_IPHONE_SIMULATOR\r\n    \r\n\tNSLog(@\"Fail to register for remote notifications: %@\", error);    \r\n\r\n#endif\r\n    \r\n}\r\n\r\n\r\n\/**\r\n * Remote Notification Received while application was open.\r\n *\/\r\n- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {\r\n    \r\n#if !TARGET_IPHONE_SIMULATOR   \r\n    \r\n    application.applicationIconBadgeNumber = 0;\r\n    self.textView.text = [userInfo description];\r\n    \r\n    \/\/ We can determine whether an application is launched as a result of the user tapping the action\r\n    \/\/ button or whether the notification was delivered to the already-running application by examining\r\n    \/\/ the application state.\r\n    \r\n    if (application.applicationState == UIApplicationStateActive) {\r\n        \/\/ Nothing to do if applicationState is Inactive, the iOS already displayed an alert view.\r\n        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@\"Did receive a Remote Notification\"\r\n                                                            message:[NSString stringWithFormat:@\"The application received this remote notification while it was running:\\n%@\",\r\n                                                                     [[userInfo objectForKey:@\"aps\"] objectForKey:@\"alert\"]]\r\n                                                           delegate:self\r\n                                                  cancelButtonTitle:@\"OK\"\r\n                                                  otherButtonTitles:nil];\r\n        [alertView show];\r\n        [alertView release];\r\n    }\r\n\r\n\tNSLog(@\"remote notification: %@\",[userInfo description]);\r\n\tNSDictionary *apsInfo = [userInfo objectForKey:@\"aps\"];\r\n    \r\n\tNSString *alert = [apsInfo objectForKey:@\"alert\"];\r\n\tNSLog(@\"Received Push Alert: %@\", alert);\r\n    \r\n\tNSString *sound = [apsInfo objectForKey:@\"sound\"];\r\n\tNSLog(@\"Received Push Sound: %@\", sound);\r\n    \r\n\tNSString *badge = [apsInfo objectForKey:@\"badge\"];\r\n\tNSLog(@\"Received Push Badge: %@\", badge);\r\n    \r\n#endif\r\n    \r\n}\r\n\r\n\/*\r\n * ---------------------------------------------------------------------\r\n *  END APNS CODE\r\n * ---------------------------------------------------------------------\r\n *\/\r\n<\/pre>\n<p>Modificare la stringa: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSString *host = @\"www.mywebsite.com\";\r\n<\/pre>\n<p>con l&#8217;URL corretta del server precedentemente predisposto.<\/p>\n<p>Modificare inoltre la stringa: <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSString *urlString = [@\"\/apns\/apns.php?\".......\r\n<\/pre>\n<p>con il percorso del file apns.php (se avete seguito passo passo lo step precedente, non dovreste cambiare questa riga).<\/p>\n<p>Ci possono essere due modi per effettuare la connessione al server APNs:<\/p>\n<ol>\n<li>in chiaro mediante protocollo HTTP<\/li>\n<li>in modo sicuro mediante protocollo HTTPS<\/li>\n<\/ol>\n<p>Controllate di utilizzare il corretto protocollo per il vostro server indicandolo in questa riga:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSURL *url = [[NSURL alloc] initWithScheme:@\"http\" host:host path:urlString];\r\n<\/pre>\n<p><strong>Attenzione:<\/strong> nel caso di utilizzo del protocollo HTTPS (che io ritengo preferibile per ovvi motivi di sicurezza) dovete fare attenzione che il server disponga anche di certificato SSL valido, altrimenti la richiesta da iOS non andr\u00e0 a buon fine.<\/p>\n<h4>Step 4: Prova finale<\/h4>\n<p>Tutti gli ingredienti sono al loro posto, non resta che provare a fare un test. Di seguito i passi e le verifiche da effettuare:<\/p>\n<ol>\n<li>Assicurarsi che il server APNs sia operativo e che tutti gli steps precedenti siano stati completati<\/li>\n<li>Per prima cosa occorre lanciare l&#8217;applicazione sul device iOS (se possibile, fatelo direttamente da Xcode in modo da vedere anche la finestra di Log, che \u00e8 interessante analizzare).<\/li>\n<li>Con un&#8217;alert view, verr\u00e0 richiesto di accettare che l&#8217;applicazione vi invii le notifiche (ovviamente dovete accettare).<\/li>\n<li>Sulla finestra di Log di Xcode si pu\u00f2 osservare il messaggio &#8220;Did register for remote notifications: token number&#8221; che testimonia che il profilo con cui \u00e8 stata compilata l&#8217;app \u00e8 corretto ed abilitato alle notifiche, infatti avete ricevuto il numero del token della vostra applicazione<\/li>\n<li>Subito dopo viene fatta la registrazione del token (insieme a molti altri dati del device e dell&#8217;applicazione) sul server APNs. Lo potrete verificare sul Log con il messaggio &#8220;Register URL: tutta l&#8217;url completa che arriver\u00e0 al server&#8221;<\/li>\n<li>Verificare se la tabella dei devices sul database \u00e8 stata popolata con un nuovo elemento utilizzando phpMyAdmin.<br \/>\n<strong>Attenzione:<\/strong> un campo della tabella del device indica se quel device \u00e8 di sviluppo oppure di produzione. Ai fini di questo tutorial (e delle vostre prove) occorre indicare manualmente che si tratta di un device di sviluppo. Per fare questo occorre aprire phpMyAdmin, andare sulla tabella &#8220;apns_devices&#8221; cliccare sull&#8217;unico record che dovrebbe essere presente (ovvero il device che \u00e8 stato appena aggiunto). Cliccare su &#8220;Edit&#8221; e cambiare il campo &#8220;development type&#8221; da &#8220;production&#8221; a &#8220;sandbox&#8221;.<\/p>\n<p><strong>Importante:<\/strong> Finch\u00e9 l&#8217;App viene compilata usando il development provisioning profile, \u00e8 possibile ricevere delle notifiche solo dall&#8217;Apple sandbox server.<\/li>\n<li>Ora \u00e8 possibile finalmente eseguire un test di notifica invocando da browser il file samples.php. Digitare quindi l&#8217;URL: http:\/\/www.vostroserverapns.com\/apns\/samples.php<\/li>\n<\/ol>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-09.png\" alt=\"come-implementare-le-Push-Notifications-con-EasyAPNS-09\" title=\"come-implementare-le-Push-Notifications-con-EasyAPNS-09\" width=\"550\" height=\"825\" class=\"aligncenter size-full wp-image-9032\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-09.png 640w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/come-implementare-le-Push-Notifications-con-EasyAPNS-09-200x300.png 200w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Risorse<\/h4>\n<ul>\n<li><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/apns.sql_.zip\" target=\"_blank\">Qui<\/a> potete scaricare lo script dei comandi SQL per creare le tabelle del database.<\/li>\n<li><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/phpsource.zip\" target=\"_blank\">Qui<\/a> potete scaricare i sorgenti PHP da personalizzare con i vostri dati.<\/li>\n<li>In arrivo anche il progetto completo Objective-C in Xcode 4.3.2.<\/li>\n<li><a href=\"https:\/\/developer.apple.com\/library\/ios\/#documentation\/NetworkingInternet\/Conceptual\/RemoteNotificationsPG\/ApplePushService\/ApplePushService.html\" target=\"_blank\">Qui<\/a> potete consultare la documentazione originale di riferimento di Apple.<\/li>\n<\/ul>\n<p>Un ringraziamento alla redazione di devAPP per avermi dato la possibilit\u00e0 di pubblicare questo tutorial sul blog. Non dimenticatevi di accedere anche al mio blog personale <a href=\"http:\/\/www.megabri.com\" target=\"_blank\">http:\/\/www.megabri.com<\/a> e al portale delle mie App <a href=\"http:\/\/www.mgproductions.it\" target=\"_blank\">http:\/\/www.mgproductions.it<\/a>.<\/p>\n<p>Gabriele Merlonghi<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/EasyAPNS-AppDemo.zip\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il progetto presentato, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/EasyAPNS-AppDemo.zip\" target=\"_blank\">questo \u00e8 il link per scaricare il nostro esempio.<\/a><\/p>\n<p><center><\/p>\n<h4>Vuoi ringraziare l&#8217;autore di questa guida?<br \/>\nOffrigli un caff\u00e8 scaricando <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/gps-alarm-pro\/id435336524?mt=8&#038;partnerId=2003\" target=\"_blank\">la sua applicazione<\/a> \ud83d\ude42<\/h4>\n<p><a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/gps-alarm-pro\/id435336524?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/Banner-GPS-Alarm-Pro.png\" alt=\"Banner GPS Alarm Pro\" title=\"Banner-GPS-Alarm-Pro\" width=\"468\" height=\"60\" class=\"aligncenter size-full wp-image-9488\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/Banner-GPS-Alarm-Pro.png 468w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/Banner-GPS-Alarm-Pro-300x38.png 300w\" sizes=\"auto, (max-width: 468px) 100vw, 468px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo nuovo tutorial faremo un re-make del #T016 dove avevamo gi\u00e0 trattato l&#8217;argomento di come implementare&#8230;<\/p>\n","protected":false},"author":529,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1116,1114,1118,1117,1112,1115,1113],"class_list":["post-9015","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-apple-pns","tag-apple-push-notification-service","tag-apple-sandbox-server","tag-creare-certificati-push-notification","tag-easyapns","tag-push-notification-server","tag-push-notifications-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/529"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=9015"}],"version-history":[{"count":42,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9015\/revisions"}],"predecessor-version":[{"id":9390,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9015\/revisions\/9390"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=9015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=9015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=9015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}