{"id":1139,"date":"2009-12-08T07:30:35","date_gmt":"2009-12-08T06:30:35","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=1139"},"modified":"2009-12-14T16:19:32","modified_gmt":"2009-12-14T15:19:32","slug":"t016-implementiamo-le-push-notifications","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t016-implementiamo-le-push-notifications\/","title":{"rendered":"T#016 &#8211; Implementiamo le Push Notifications"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2009\/12\/apple-push-notification-service.jpg\" alt=\"apple-push-notification-service\" title=\"apple-push-notification-service\" width=\"108\" height=\"118\" class=\"alignleft size-full wp-image-1155\" \/> Oggi vedremo come implementare le notifiche push nelle nostre applicazioni. Ringraziamo lo sviluppatore <strong>Cristian Gintili<\/strong>, creatore delle applicazioni <a href=\"http:\/\/itunes.apple.com\/us\/app\/id317719764?mt=8\" target=\"_blank\">Million<\/a>, <a href=\"http:\/\/itunes.apple.com\/us\/app\/clienti\/id315129981?mt=8\" target=\"_blank\">Clienti<\/a> e <a href=\"http:\/\/itunes.apple.com\/us\/app\/genoa\/id309788417?mt=8\" target=\"_blank\">Genoa<\/a> (che potete trovare su App Store), il quale ci ha concesso la pubblicazione di questa utilissima guida disponibile anche sul suo sito personale <a href=\"http:\/\/www.icgdev.com\/\" target=\"_blank\">iCGdev<\/a>.<\/p>\n<p>La prima cosa da fare per poter utilizzare le <strong>notifiche push<\/strong> nella propria applicazione iPhone, \u00e8 creare i profili ed i certificati. Accedere quindi all\u2019<em>iPhone Developer Program Portal<\/em> ed andare nella sezione <em>App IDs<\/em>. Non \u00e8 possibile utilizzare un profilo con wild-card (ovvero con l\u2019asterisco), per cui se non avete gi\u00e0 un profilo senza wild-card, dovete crearne uno nuovo cliccando su <em>New App ID<\/em>.<!--more--><\/p>\n<p>Dopo aver creato l\u2019App ID, cliccate su <em>Configure<\/em> e create il certificato SSL seguendo la procedura guidata (molto semplice). Al termine del procedimento, scaricate il certificato appena creato (file con estensione <strong>.cer<\/strong>). <\/p>\n<p>Ora dovete installare il certificato appena scaricato: doppio click su di esso ed il certificato verr\u00e0 importato nel Portachiavi. Nel Portachiavi, andate nella categoria &#8220;<em>I miei certificati<\/em>&#8221; e noterete un certificato chiamato &#8220;<em>Apple Development Push Services<\/em>&#8220;, cliccateci sopra col tasto destro del mouse e cliccate su Esporta. Salvate il file con il nome <strong>apns-dev-cert.p12<\/strong> Tornate al certificato &#8220;<em>Apple Development Push Services<\/em>&#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 <strong>terminale<\/strong> e posizionatevi nella cartella dove avete esportato i file sopra citati. Date i seguenti comandi, uno dopo l\u2019altro (inserendo la password e la passphrase dove richiesto):<\/p>\n<pre lang=\"text\" escaped=\"true\">\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 <em>apns-dev.pem<\/em> che dovrete &#8220;uppare&#8221; sul vostro server. L\u2019installazione dei certificati \u00e8 terminata. Ora dovete installare i profili. Tornate nell\u2019iPhone Developer Program Portal ed andate nella sezione <em>Provisioning<\/em>. Create un nuovo profilo e scaricatelo. Importatelo in Xcode utilizzando la stessa procedura che avete usato per gli altri profili.<br \/>\nQuesta procedura va eseguita due volte: una per i certificati e profili per il development (ovvero quando testate l\u2019applicazione) e una per la distribution (ovvero quando inviate l\u2019applicazione alla Apple).<\/p>\n<p>N.B. <strong>Il certificato ed il profilo valgono solo per una singola applicazione<\/strong>. Per cui se volete inserire le push notifications in pi\u00f9 applicazioni, dovrete installare pi\u00f9 certificati e profili.<\/p>\n<p>Ora viene la parte della programmazione, che si divide in ulteriori due parti: <strong>server e client<\/strong>.<\/p>\n<p>Per utilizzare le Notifiche Push, dovete disporre di un <strong>vostro server remoto sempre accessibile<\/strong>, nel quale dovrete eseguire uno script (o un demone, un processo, un&#8217;applicazione, ecc ecc) che si occuper\u00e0 di comunicare con i server della Apple.<\/p>\n<p>Di seguito vi posto uno script PHP che, ogni volta che viene richiamato, invia una richiesta al server della Apple, il quale poi si occuper\u00e0 di inviare la notifica all\u2019iPhone dove \u00e8 installata la vostra applicazione.<\/p>\n<pre lang=\"php\" escaped=\"true\">\r\n<?php\r\n      $deviceToken = $token; \/\/ token dell\u2019iPhone a cui inviare la notifica\r\n\r\n      \/\/ Passphrase for the private key (ck.pem file)\r\n      \/\/ $pass = \u201d;\r\n      \/\/ Get the parameters from http get or from command line\r\n      $message = \u2018Testo Notifica Push\u2019;\r\n      $badge = 1;\r\n      $sound = \u2018default\u2019;\r\n\r\n      \/\/ Construct the notification payload\r\n      $body = array();\r\n      $body['aps'] = array(\u2019alert\u2019 => $message);\r\n      \r\n      if ($badge)\r\n            $body['aps']['badge'] = $badge;\r\n      if ($sound)\r\n            $body['aps']['sound'] = $sound;\r\n     \r\n      \/* End of Configurable Items *\/\r\n      $ctx = stream_context_create();\r\n      stream_context_set_option($ctx, \u2019ssl\u2019, \u2018local_cert\u2019, \u2018apns-dev.pem\u2019);\r\n\r\n      \/\/ assume the private key passphase was removed.\r\n      \/\/ stream_context_set_option($ctx, \u2019ssl\u2019, \u2019passphrase\u2019, $pass);\r\n      $fp = stream_socket_client(\u2019ssl:\/\/gateway.sandbox.push.apple.com:2195\u2032, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);\r\n\r\n      if (!$fp) {\r\n            print \u201cFailed to connect $err $errstrn\u201d;\r\n            return;\r\n      } else {\r\n            print \u201cConnection OK\\n\u201d;\r\n      }\r\n\r\n      $payload = json_encode($body);\r\n      $msg = chr(0) . pack(\u2019n',32) . pack(\u2019H*\u2019, str_replace(\u2019 \u2019, \u201d, $deviceToken)) . pack(\u2019n',strlen($payload)) . $payload;\r\n      print \u201csending message :\u201d . $payload . \u201c\\n\u201d;\r\n      fwrite($fp, $msg);\r\n      fclose($fp);\r\n?>\r\n<\/pre>\n<p>Questo file lo potete e dovete modificare a vostro piacimento, oppure potete utilizzare un altro tipo di sistema per creare uno script lato server. Dovete &#8220;uppare&#8221; sul vostro server, sia lo script qui sopra (od un altro al suo posto) sia il certificato <em>apns-dev.pem<\/em> creato in precedenza.<\/p>\n<p><strong>N.B.<\/strong>: per il development, dovete utilizzare il server <strong>ssl:\/\/gateway.sandbox.push.apple.com:2195<\/strong> per testare le push notifications, mentre per la distribution dovete utilizzare il server <strong>ssl:\/\/gateway.push.apple.com:2195<\/strong><\/p>\n<p>La programmazione lato server \u00e8 terminata, ora non resta che occuparci della parte client, ovvero la parte che riguarda la vostra applicazione. <\/p>\n<p>A questo punto abbiamo due cose da fare: <\/p>\n<ul>\n<li>abilitare le notifiche push<\/li>\n<li>prelevare il token del device.<\/li>\n<\/ul>\n<p>La Apple raccomanda di prelevare il token ogni volta che viene avviata l\u2019applicazione. Questo perch\u00e8, in caso di ripristino, il token cambia, per cui, se non lo aggiornate, le notifiche push non arriveranno pi\u00f9 su quel device.<\/p>\n<p>Per abilitare le notifiche push, inserite la seguente stringa nel metodo <strong>applicationDidFinishLaunching<\/strong> nell\u2019appDelegate:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge];\r\n<\/pre>\n<p>Dopodich\u00e8, sempre nell\u2019appDelegate, impostate i seguenti metodi:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken{\r\n\r\n\/\/ Qui registrate e\/o inviate il token\r\n\r\n}\r\n\r\n- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err{\r\n\r\n\/\/ Qui intercettate eventuali errori avvenuti se la registrazione fallisce\r\n\r\n}\r\n<\/pre>\n<p>La parte client \u00e8 gi\u00e0 bella che finita!<\/p>\n<p>Bene, questo \u00e8 tutto quello che c\u2019\u00e8 da sapere sull\u2019implementazione delle Push Notifications nelle vostre applicazioni.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vedremo come implementare le notifiche push nelle nostre applicazioni. Ringraziamo lo sviluppatore Cristian Gintili, creatore delle&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[5,4,56,57,1],"class_list":["post-1139","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-objective-c","tag-programmazione","tag-push","tag-push-notification","tag-tutorial-pratici"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/1139","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=1139"}],"version-history":[{"count":24,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/1139\/revisions"}],"predecessor-version":[{"id":1329,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/1139\/revisions\/1329"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=1139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=1139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=1139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}