Ed eccoci giunti al nostro 100° tutorial sulla programmazione iPhone e iPad, per noi un bel traguardo e per festeggiare vi proponiamo una guida per l’implementazione di una funzionalità molto interessante per le nostre applicazioni iOS: l’integrazione di Dropbox. Come tutti voi saprete, i servizi di cloud prendono sempre più piede nelle nostre case, nei nostri uffici e ovviamente nei nostri device e non si può negare quanto sia utile condividere file fra tutti i nostri dispositivi: non importa dove ci troviamo o cosa abbiamo a disposizione, i nostri dati saranno sempre con noi! Anche Apple entrerà presto in questo mercato con il suo servizio iCloud (e già c’era con il suo mobile me e iDisk) ma dato che ancora non possiamo parlare del servizio in arrivo essendo tutta la documentazione ufficiale e il codice sotto NDA, parleremo del suo “concorrente” già utilizzato in larga scala e in tutto il mondo: Dropbox.
DropBox è un servizio di cloud storage che fornisce 2GB di spazio gratuito (previa registrazione) più ulteriori 250MB per ogni utente da noi inviato ad usare il servizio, che deciderà di utilizzare il Dropbox come noi (fino ad un limite massimo di 8GB). Niente male come versione free, ma se avessimo bisogno di più spazio, sappiate che esistono diverse offerte in abbonamento a prezzi bassissimi per ogni esigenza:

Dopo questa piccola premessa possiamo partire con il nostro tutorial dedicato all’integrazione di DropBox nella nostra applicazione iOS.
Creiamo l’applicazione nel sito di DropBox
Il primo passo è quello di creare un applicazione nel sito di DropBox. Per fare questo dovremo necessariamente avere un account, se non ne avete uno potrete crearlo seguendo questo indirizzo.
Fatto questo entriamo nella sezione developer e ci ritroveremo davanti una schermata simile alla seguente:

Come vedete sulla sinistra troviamo un menù, clicchiamo su “My apps”, quindi su “Create an App”:

Nella finestra che si apre inseriamo il nome della nostra app e una descrizione, clicchiamo quindi su create.
Ci verranno mostrati i dettagli e le chiavi dell’applicazione appena creata:

Quello che ci servirà e che dovremo usare nel nostro coedice sono le due chiavi: quella segreta e quella dell’app.
Download SDK
A questo punto dovremo scaricare l’SDK per poi integrarlo nella nostra app. Scarichiamolo quindi da questo indirizzo e una volta ottenuto scompattiamolo e apriamo la cartella appena ottenuta.

All’interno troviamo una cartella con degli esempi e la più importante, quella contenente l’SDK vero e proprio.
Integriamo DropBox nella nostra applicazione
Se avete fatto tutto quello spiegato qui sopra, siete pronti per passare alla parte più divertente ed importante del tutorial: l’integrazione di DropBox nella nostra app. DropBox fornisce diverse funzionalità in REST che ci permettono di ottenere molte informazioni sull’utente, sul contenuto della cartella DropBox e naturalmente la possibilità si uploadare e scaricare i nostri file.
Noi, in questo tutorial, vedremo nello specifico l’ultima funzionalità, ovvero scopriremo come usare dropBox per fare il backup dei nostri file.
Per semplicità partiremo da un nuovo progetto e mostreremo come fare un semplice upload e download di un file.
Apriamo Xcode e creiamo un nuovo progetto di tipo “viewBased”, quindi diamogli un nome a piacere e proseguiamo. Fatto questo io ho trascinato all’interno del progetto un’immagine a caso, che useremo per fare upload e download.
Iniziamo a configurare il nostro “viewController” via codice creando 3 pulsanti e un’imageView. I tre pulsanti serviranno rispettivamente per fare l’upload dell’immagine, scaricarla e resettarla, mentre nell’imageView visualizzeremo la nostra immagine.
Questa parte di codice è davvero molto semplice, ricordatevi di impostare il tag dell’imageView in modo tale da essere in grado poi di recuperarla (se non sapete come usare i tag o volete rinfrescarvi la memoria date una lettura a questo nostro tutorial).
Ecco il codice:
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor groupTableViewBackgroundColor];
UIButton * btnUpload = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnUpload.frame = CGRectMake(30, 20, 110, 40);
[btnUpload addTarget:self action:@selector(uploadImg) forControlEvents:UIControlEventTouchDown];
[btnUpload setTitle:@"upload Img" forState:UIControlStateNormal];
[self.view addSubview:btnUpload];
UIButton * btnDown = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnDown.frame = CGRectMake(30, 80, 110, 40);
[btnDown addTarget:self action:@selector(downloadImg) forControlEvents:UIControlEventTouchDown];
[btnDown setTitle:@"download Img" forState:UIControlStateNormal];
[self.view addSubview:btnDown];
UIButton * btnReset = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btnReset.frame = CGRectMake(170, 20, 110, 40);
[btnReset addTarget:self action:@selector(resetImg) forControlEvents:UIControlEventTouchDown];
[btnReset setTitle:@"reset Img" forState:UIControlStateNormal];
[self.view addSubview:btnReset];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 130, 300, 320)];
imgView.image = [UIImage imageNamed:@"imgUpload.png"];
imgView.tag = 10;
[self.view addSubview:imgView];
[imgView release];
}
-(void)resetImg
{
UIImageView * imgTemp = (UIImageView*)[self.view viewWithTag:10];
imgTemp.image = nil;
}
Ora procediamo con l’integrazione dell’SDK. Prendiamo la cartella che abbiamo scaricato prima, apriamola e trasciniamo la cartella “Dropbox SDK” dentro il nostro progetto, ricordando di spuntare la voce “copy items into destination group’s folder”, quindi aggiungiamo il framework security al progetto.
Passiamo ora all’app delegate, dove dovremo scrivere del codice che ci permetterà di iniziare la sessione con dropBox. Finchè non faremo operazioni di alcun tipo non verrà chiesto all’utente di loggarsi con il suo account dropbox.
Importiamo l’sdk:
#import "DropboxSDK.h"
Modifichiamo quindi il nostro delegate in modo tale che appena l’applicazione viene aperta inizi la sessione con Dropbox.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
DBSession* dbSession =
[[[DBSession alloc]
initWithConsumerKey:@"sy94bo68a0uruk7"
consumerSecret:@"ijzhbkm2ixzq8ys"]
autorelease];
[DBSession setSharedSession:dbSession];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
Vi ricordo che in “ConsumerKey” e “consumerSecret” dovrete mettere le vostre rispettive chiavi che avete ottenuto e vedere nella pagina di dettaglio della vostra app sul sito developer di Dropbox.
Upload di un file
Vediamo ora come fare l’upload della nostra immagine. Apriamo il file di intestazione (.h) del nostro viewController, importiamo quindi l’sdk, settiamo i due delegati e dichiariamo i 3 metodi che useremo:
#import "DropboxSDK.h"
@interface devAPPT100ViewController : UIViewController
{
}
-(void)uploadImg;
-(void)downloadImg;
-(void)resetImg;
@end
Fatto questo passiamo al file di implementazione (.m) e iniziamo a scrivere il metodo per l’upload. Prima di tutto controlliamo che la sessione sia aperta, in tal caso facciamo l’upload del file, in caso contrario richiamiamo il controller che ha il compito di far fare il login all’utente.
-(void)uploadImg
{
if([[DBSession sharedSession] isLinked])
{
NSLog(@"linkato");
}
else
{
DBLoginController* controller = [[DBLoginController new] autorelease];
[controller presentFromController:self];
controller.delegate = self;
}
}
- (void)loginControllerDidLogin:(DBLoginController*)controller{
NSLog(@"login effettuato");
}
- (void)loginControllerDidCancel:(DBLoginController*)controller
{
NSLog(@"login cancellato");
}
Nel controller per far fare l’upload abbiamo impostato i delegati, in questo modo sapremo se l’utente ha fatto o meno il login. Occupiamoci ora di come realizzare il backup della nostra immagine, iniziamo dichiarando nel viewController.h un oggetto DBRestClient, questo oggetto ci servirà per comunicare con la cartella remota, uploadare file e scaricarli (oltre a molte altre funzionalità che non vedremo in questo tutorial)
@interface devAPPT100ViewController : UIViewController
{
DBRestClient* restClientUP;
}
Nel file .m allochiamo l’oggetto restClientUP e facciamo l’upload del file. Torniamo al metodo uploadImg e modifichiamo il codice nel punto in cui sappiamo che il nostro utente è loggato aggiungendo le istruzioni per l’upload vero e proprio del file:
NSString *textFileNameN = @"immagine.png";
NSString *dropBoxFolderN = @"/devAPPt100";
-(void)uploadImg
{
if([[DBSession sharedSession] isLinked])
{
NSLog(@"linkato");
if (!restClientUP)
{
restClientUP =
[[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
restClientUP.delegate = self;
[restClientUP createFolder:dropBoxFolderN];
}
[restClientUP uploadFile:textFileNameN
toPath:dropBoxFolderN
fromPath:[[NSBundle mainBundle] pathForResource:@"imgUpload" ofType:@"png"]];
}
else
{
DBLoginController* controller = [[DBLoginController new] autorelease];
[controller presentFromController:self];
controller.delegate = self;
}
}
Niente di complesso, abbiamo aggiunto l’oggetto restClientUP, lo abbiamo allocato e inizializzato con la sessione, abbiamo settato il delegato e gli abbiamo detto di creare la cartella devAPPt100. Fatto questo le istruzioni seguenti servono a fare l’effettivo upload del file immagine.png nel path devAPPt100 usando il file imgUpload.png.
Grazie al delegate possiamo sapere se il file è stato caricato o meno:
- (void)restClient:(DBRestClient*)client uploadProgress:(CGFloat)progress forFile:(NSString*)destPath from:(NSString*)srcPath
{
NSLog(@"load file: %f\n", progress);
}
- (void)restClient:(DBRestClient*)client uploadedFile:(NSString*)destPath from:(NSString*)srcPath
{
NSLog(@"file uppato\n");
}
- (void)restClient:(DBRestClient*)client uploadFileFailedWithError:(NSError*)error
{
NSLog(@"errore file uppato\n");
}
In questo modo potremmo prevenire e gestire eventuali blocchi o errori durante l’upload. Se volete potete rifinire aggiungendo una progressBar per visualizzare lo stato di upload/download.
Download di un file
Vediamo ora come effettuare il download di un file, il codice è molto simile:
-(void)downloadImg
{
if([[DBSession sharedSession] isLinked])
{
NSLog(@"linkato");
if (!restClientUP)
{
restClientUP =
[[DBRestClient alloc] initWithSession:[DBSession sharedSession]];
restClientUP.delegate = self;
}
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *path = [documentsDir stringByAppendingPathComponent:@"imgUpload.png"];
[restClientUP loadFile:@"/devAPPt100/imgUpload.png" intoPath:path];
}
else
{
DBLoginController* controller = [[DBLoginController new] autorelease];
[controller presentFromController:self];
controller.delegate = self;
}
}
- (void)restClient:(DBRestClient*)client loadedFile:(NSString*)destPath contentType:(NSString*)contentType
{
NSLog(@"dest path: %@, contetType: %@",destPath, contentType);
UIImageView * imgTemp = (UIImageView*)[self.view viewWithTag:10];
imgTemp.image = nil;
imgTemp.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:destPath]];
}
-(void)restClient:(DBRestClient *)client loadFileFailedWithError:(NSError *)error
{
NSLog(@"error: %@", error);
}
Prima di tutto verifichiamo l’oggetto restClientUP, se non è allocato lo allochiamo e inizializziamo con la sessione che viene creata nell’appDelegate, quindi andiamo a creare il percorso dove salvare il file che dobbiamo scaricare. Ricordo che i file creati, modificati, scaricati a runtime li potremo posizionare solo nella cartella Documents, in quanto la cartella del progetto è una sandbox.
Chiamiamo quindi il metodo loadFile, questo metodo ha il compito di prendere un file da una cartella su DropBox e scaricarlo in un percorso locale.
A scaricamento avvenuto viene richiamato il metodo loadedFile, questo metodo ci ritorna il percorso del file sulla cartella dropBox e il percorso sulla quale è salvato il file nel nostro device, che useremo per mostrarla nell’imageView, a cui possiamo accedere tramite la property tag settata ad inizio tutorial, ad inizio tutorial, prima però togliamo l’immagine precedente in modo da visualizzare quella appena scaricata.
Il nostro tutorial termina qui, certamente non è da considerare come applicazione completa, ma un riferimento che ci spiega come caricare e scaricare da dropBox un file. Analogamente potrete sperimentare tutte le altre funzionalità offerte ai developer da questo ottimo servizio.
Questo il risultato finale:

Se avete problemi con il progetto presentato, questo è il link per scaricare il nostro esempio.
11 Responses to “T#100 – Integrare Dropbox nelle applicazioni iPhone ed iPad”
9 Settembre 2011
ittagliaBravissimi ragazzi!!! siete sempre un passo avanti a tutti !! grazie per queste e utilissime guide!!!
ps: è grazie a voi che adesso posso cavermela alla grande con l’sdk di iphone!!!
9 Settembre 2011
AndreaGrazie ittaglia!! E grazie a tutti gli utenti che ci seguono…:):):) è anche merito vostro…xD
10 Settembre 2011
ignaziocgrande tutorial.
semplice e chiaro fa venire voglia di usare dropbox….anzi perché non aggiungi il link con il tuo invito? magari qualche utente vuole registrarsi e così guadagni 250mb 🙂
10 Settembre 2011
Andrea Cappellottograzie ignazio..:) mi fa piacere k ti sia piaciuto.. giustamente!! se volete registrarvi a dropbox e non l’avete ancora fatto, ecco il mio link
http://db.tt/67yMiPT
grazie a tutti per il supporto!! 😉
12 Settembre 2011
valvoline🙂 Bravo Andrea…semplice chiaro ed utile.
12 Settembre 2011
Andrea Cappellottograzie mille, e grazie a quelli che mi hanno donato 250Mb su dropBox…;)
17 Settembre 2011
ikarowebComplimenti, ottimo articolo 😉
22 Settembre 2011
PanterixSiete i migliori stó continuando a studiare,prima o poi riusciró a sviluppare la mia app.
29 Novembre 2011
DaniloBastano 50GB free ? Box.net
http://itunes.apple.com/us/app/box.net/id290853822?mt=8
Addio DropBox !
16 Ottobre 2012
AstroNella mia applicazione periPad, sto usando l’integrazione con Dropbox.
Funziona perfettamente, ma ora ho un dubbio. Ho letto che Apple ha rifiutato molte applicazioni che utilizzano Dropbox, perché nella pagina di login c’è un link per iscriversi. Ora ho notato che se avvio l’applicazione con l’iPad, viene visualizzata una pagina di login che mostra anche altri collegamenti, quindi temo che l’app potrebbe essere rifiutata.
Cosa posso fare?
Questo è lo screenshot: http://i46.tinypic.com/23tkz0k.png
1 Giugno 2013
matteociao a tutti!
complimenti per l’ottima guida!!!
una domanda stupida: ma dropbox potrebbe essere usato come contenitore di un database che contiene i dati dell’applicazione?