{"id":8803,"date":"2012-04-24T17:44:57","date_gmt":"2012-04-24T15:44:57","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=8803"},"modified":"2012-04-24T17:46:03","modified_gmt":"2012-04-24T15:46:03","slug":"t108-creare-un-backend-potente-e-scalabile-per-le-proprie-app-in-pochi-minuti-con-parse","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t108-creare-un-backend-potente-e-scalabile-per-le-proprie-app-in-pochi-minuti-con-parse\/","title":{"rendered":"T#108 &#8211; Creare un backend potente e scalabile per le proprie app in pochi minuti con Parse"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/parse-logo.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/parse-logo.jpg\" alt=\"parse-logo\" title=\"parse-logo\" width=\"150\" height=\"67\" class=\"alignleft size-full wp-image-8809\" \/><\/a> Oggi vedremo come sfruttare un potente e utile servizio offerto da una giovane startup americana, che ci permetter\u00e0 di creare in pochi minuti un backend per le nostre applicazioni iPhone, iPad o Android per la gestione di dati remoti, login e molto altro. Parleremo di <a href=\"http:\/\/www.parse.com\" target=\"_blank\">Parse<\/a>! Vediamo di cosa si tratta e come sfruttarlo nelle nostre app.<!--more--><\/p>\n<h4>Cos&#8217;\u00e8 Parse<\/h4>\n<p>Parse (www.parse.com) \u00e8 un servizio server dedicato agli sviluppatori mobile\/web molto interessante e per certi aspetti unico. La piattaforma \u00e8 in continuo aggiornamento, ma ad oggi le principali funzioni disponibili per le nostre app sono:<\/p>\n<ul>\n<li>db NoSQL remoto (ovvero basato sul concetto di chiave\/valore tipico delle hashmap o dei json)<\/li>\n<li>hosting di file<\/li>\n<li>push notification<\/li>\n<li>login tramite facebook\/twitter<\/li>\n<\/ul>\n<p>Ma mentre push e login ai social networks sono servizi offerti anche da altri siti, i primi due (db e file) sono realmente innovativi e, per come sono implementati, ad oggi unici.<\/p>\n<p>Grazie al <strong>db NoSQL<\/strong> si possono dotare le app di una infrastruttura server per erogare contenuti (notizie, livelli di gioco, classifiche\u2026) o memorizzare informazioni (punteggi, configurazioni, messaggi utente, log\u2026) mentre la gestione &#8220;cloud&#8221; dei file \u00e9 relativa all&#8217;app e non ad un utente come iCloud, quindi potenzialmente condivisa fra tutti gli utenti (foto sharing ad esempio). Le API esistono per varie piattaforme (iOS, Android, http\u2026).<br \/>\nInoltre, fatto non da poco, per volumi contenuti (ma neppure troppo) Parse \u00e8 completamente gratuito, quindi l&#8217;ideale per testare e gestire app anche complesse senza accollarsi il costo iniziale dell&#8217;infrastruttura server: se l&#8217;app avr\u00e0 successo (pi\u00f9 di un milione di chiamate al server al mese) dovremo pagare altrimenti l&#8217;unico investimento sar\u00e0 stato il tempo impiegato nello sviluppo dell&#8217;app. E personalmente sarei ben contento di essere costretto a pagare a causa dell&#8217; &#8220;eccessivo&#8221; successo di una mia app! \ud83d\ude09<\/p>\n<p>Questo tutorial sar\u00e0 diviso in due parti. Nella prima seguir\u00f2 pi\u00f9 o meno passo passo l&#8217;eccellente tutorial disponibile sul sito stesso di Parse, in modo da impratichirsi con i concetti di base, mentre nella seconda parte proporr\u00f2 alcune idee su come utilizzarlo, con relativo codice ovviamente!<\/p>\n<h4>Creare l&#8217;app di Test<\/h4>\n<p>Per prima cosa dovrete registrarvi sul sito (<a href=\"http:\/\/www.parse.com\" target=\"_blank\">www.parse.com<\/a>) per poter creare il vostro account (ricordo che l&#8217;operazione \u00e8 gratuita).<br \/>\nOra dovete creare lo spazio db per la vostra &#8220;app&#8221; sul sito: dal menu in alto scegliete &#8220;Your App&#8221; e create un&#8217;app &#8220;TestAPP&#8221; (viva la fantasia!). Potete avere quante app volete, ma ricordate che il conteggio del traffico verr\u00e0 fatto sul totale delle vostre app.<\/p>\n<p>Appena creata vi verr\u00e0 presentata una schermata di riepilogo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-01.jpg\" alt=\"tutorial-parse-backend-ios-android-app-01\" title=\"tutorial-parse-backend-ios-android-app-01\" width=\"550\" height=\"326\" class=\"aligncenter size-full wp-image-8810\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-01.jpg 800w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-01-300x177.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>che contiene i dati del traffico effettuato finora e altre informazioni (Application ID etc\u2026) che vedremo in seguito.<br \/>\nOra non dovremo far altro che selezionare QuickStart, scegliere &#8220;New iOS project&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-02.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-02.jpg\" alt=\"tutorial-parse-backend-ios-android-app-02\" title=\"tutorial-parse-backend-ios-android-app-02\" width=\"550\" height=\"393\" class=\"aligncenter size-full wp-image-8811\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-02.jpg 800w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-02-300x214.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>e seguire le semplicissime istruzioni passo-passo che il sito ci propone.<\/p>\n<p>Per quelli che proprio ci litigano con l&#8217;Inglese illustrer\u00f2 brevemente i vari passaggi (gli altri facciano riferimento direttamente al sito).<\/p>\n<p><strong>Punto 1.<\/strong><br \/>\nScaricare il progetto XCode con dentro gi\u00e0 l&#8217;SDK ed apritelo con XCode.<\/p>\n<p><strong>Punto 2.<\/strong><br \/>\nAprite il file ParseStarterProjectAppDelegate.m e 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>sostituite il commento con le due righe che trovate nel sito. Qualcosa del tipo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[Parse setApplicationId:@\"AZJD783JSJKXXXXXXXXXX\" \r\n                        clientKey:@\"ASSKmmXXXXXXXXXX\"];\r\n<\/pre>\n<p>Tenete presente che quei dati sono gi\u00e0 GIUSTI! il QuickStart vi da gi\u00e0 le informazioni corrette per l&#8217;app per cui state facendo la procedura: comodo no?<\/p>\n<p>Spendo due parole su questi codici misteriosi: sono usati da Parse per identificate l&#8217;accoppiata sviluppatore\/app, per l&#8217;accesso ai vari servizi, senza che sia quindi necessario includere nell&#8217;app stessa i vostri dati di login. In questo modo voi potete gestire l&#8217;account senza impattare sulle app rilasciate e senza mandare in giro dati troppo sensibili: nella peggiore delle ipotesi un hacker potrebbe &#8220;solo&#8221; accedere ai dati dell&#8217;app, non a tutto il vostro account.<\/p>\n<p><strong>Punto 3.<\/strong><br \/>\nNel file .h del view controller (ParseStarterProjectViewController.h) aggiungete la riga:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <Parse\/Parse.h>\r\n<\/pre>\n<p>mentre nel file .m incollate il metodo viewDidLoad riportato qui sotto:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad\r\n{\r\n\t[super viewDidLoad];\r\n\tPFObject *testObject = [PFObject objectWithClassName:@\"TestObject\"];\r\n\t[testObject setObject:@\"valore\" forKey:@\"chiave\"];\r\n\t[testObject save];\r\n}\r\n<\/pre>\n<p>A questo punto basta lanciare l&#8217;app che presenter\u00e0 una schermata del tipo &#8220;se leggi questo va  tutto bene&#8221;.<br \/>\nQuale verifica potete premere il bottone &#8220;TEST&#8221; presente nel QuickStart o ancora meglio selezionare l&#8217;app da &#8220;Your Apps&#8221; e andare in &#8220;Data Browser&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-03.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-03.jpg\" alt=\"tutorial-parse-backend-ios-android-app-03\" title=\"tutorial-parse-backend-ios-android-app-03\" width=\"550\" height=\"215\" class=\"aligncenter size-full wp-image-8812\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-03.jpg 800w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/tutorial-parse-backend-ios-android-app-03-300x117.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>dove vedrete una tabella con, tra le altre, una colonna &#8220;chiave&#8221; ed una riga col corrispondente &#8220;valore&#8221;.<\/p>\n<h4>Approfondimenti<\/h4>\n<p>Da qui in avanti \u00e8 d&#8217;obbligo seguire la &#8220;iOS Guide&#8221; presente nella sezione Docs, che vi guider\u00e0 con semplici esempi nello scoprire tutte le funzionalit\u00e0.<br \/>\nTradurla non \u00e8 ovviamente lo scopo di questo tutorial, ma ora che avete un&#8217;app con cui sperimentare mi sar\u00e0 pi\u00f9 semplice illustrare alcuni concetti chiave.<\/p>\n<p>Abbiamo visto come Parse organizzi i suoi servizi per App, che a loro volta contengono una o pi\u00f9 Class che contengono dei <strong>PFObject<\/strong>, dati non rigidamente strutturati consistenti in serie di coppie chiave\/valore: insomma, dei json, a cui Parse aggiunge automaticamente alcune info per facilitarne la gestione, ovvero un id univoco e le date di creazione e ultima modifica.<br \/>\nCon semplici chiamate \u00e8 possibile crearli in locale o leggerli dal server, modificarli e salvarli in remoto, sia in maniera sincrona che asincrona (in background). Inoltre nel caso non sia indispensabile un salvataggio immediato &#8220;saveEventually&#8221; permette di continuare con l&#8217;elaborazione lasciando a Parse il compito di salvare appena la rete sar\u00e0 disponibile.<\/p>\n<p>E&#8217; possibile anche eseguire query pi\u00f9 o meno complesse sui dati e pure ordinarli: certo non si possono creare certi &#8220;mostri&#8221; tipici dell&#8217;SQL ma comunque le opzioni dovrebbero coprire la quasi totalit\u00e0 delle necessit\u00e0.<br \/>\nRecentemente \u00e8 stato anche aggiunto un sistema di caching dei risultati delle query, cos\u00ec da poter memorizzare sul dispositivo il risultato e quindi (a certe condizioni) lavorare anche offline.<\/p>\n<p>Infine un accenno alla gestione dei file: i PFObject non sono adatti a contenere dati di grosse dimensioni (max 128Kb): oltre \u00e8 necessario usare i PFFile, la cui dimensione massima \u00e8 di 10Mb. Come per i PFObject esistono API per leggerli e salvarli in background monitorando anche il progresso dell&#8217;operazione.<\/p>\n<h4>Lato Server<\/h4>\n<p>Finora abbiamo visto come gestire i dati dall&#8217;app, ma potrebbe essere necessario immetterli direttamente sul server utilizzando l&#8217;app per visualizzarli.<br \/>\nPer fare ci\u00f2 possiamo usare la pagina &#8220;Data Browser&#8221; del sito. Da l\u00ec infatti \u00e8 possibile creare, cancellare e modificare le classi e il loro contenuto. Per inserire grosse moli di dati \u00e8 per\u00f2 pi\u00f9 semplice prepararli con altri programmi (anche un semplice foglio excel potrebbe andare bene in molti casi) e poi esportarli in formato CSV: la prima riga rappresentar\u00e0 le chiavi, le successive i record da inserire.<br \/>\nTenete presente che il tipo di architettura vi permette anche di inserite in una Class gi\u00e0 esistente dei nuovi record che hanno delle colonne in pi\u00f9 senza problemi e senza che voi dobbiate fare nulla: Parse si preoccuper\u00e0 di aggiungerle in automatico. Chi di voi si \u00e8 gi\u00e0 scontrato con l&#8217;aggiornamento di versione di una base dati SQL apprezzer\u00e0 sicuramente&#8230;<\/p>\n<h4>Conclusione<\/h4>\n<p>Parse permette di aggiungere un server alle vostre app, senza doversi preoccupare di impostare e gestire il backend. I dati sono organizzati in strutture di tipo json su cui \u00e8 possibile effettuare query anche molto complesse, senza peraltro essere costretti ad una rigida struttra del record tipica dei database SQL classici.<\/p>\n<p>Nella seconda parte di questa guida vedremo alcuni esempi pratici di utilizzo.<\/p>\n<p><center><br \/>\n<strong>Se ti \u00e8 piaciuto il tutorial, ringrazia l&#8217;autore scaricando l&#8217;app &#8220;Fai per tre!&#8221; per iPhone, <a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&#038;a=1735897&#038;g=0&#038;url=http:\/\/itunes.apple.com\/it\/app\/fai-per-3!\/id417726253?mt=8&#038;partnerId=2003\" target=\"_blank\">gratis in App Store<\/h4>\n<p>.<\/strong><\/p>\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\/fai-per-3!\/id417726253?mt=8&#038;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/fai-per-tre-iphone.jpg\" alt=\"fai-per-tre-iphone\" title=\"fai-per-tre-iphone\" width=\"550\" height=\"403\" class=\"aligncenter size-full wp-image-8821\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/fai-per-tre-iphone.jpg 550w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/04\/fai-per-tre-iphone-300x219.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vedremo come sfruttare un potente e utile servizio offerto da una giovane startup americana, che ci&#8230;<\/p>\n","protected":false},"author":548,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1085,1086,1084,1083,1087],"class_list":["post-8803","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-backend-ios-android-app","tag-login-app-ios-tutorial","tag-parse-tutorial","tag-push-notification-ios","tag-tutorial-parse-com"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8803","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\/548"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=8803"}],"version-history":[{"count":28,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8803\/revisions"}],"predecessor-version":[{"id":8837,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/8803\/revisions\/8837"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=8803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=8803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=8803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}