SlideShare a Scribd company logo
1 of 62
iOS e il Cloud
Francesco Novelli
francesco.nove@gmail.com - Run Code
Chi Sono?
Francesco Novelli
- iOS Developer
- Web Developer
- Autore di Programmare applicazioni per
iPhone ed iPad
-Autore di Programamre applicazioni per
Mac OS X
francesco.nove@gmail.com - Run Code
Chi Sono?
Francesco Novelli francesco.nove@gmail.com - Run Code
Di cosa parliamo oggi?
Francesco Novelli
CLOUD!
francesco.nove@gmail.com - Run Code
Di cosa parliamo oggi?
Francesco Novelli
e iOS...
francesco.nove@gmail.com - Run Code
Di cosa parliamo oggi?
Francesco Novelli
- iCloud
- DropBox
- Google Drive
- Amazon S3
francesco.nove@gmail.com - Run Code
iCloud
Francesco Novelli
- Caratteristiche principali
- Come implementarlo in un App
- Pro
- Contro
francesco.nove@gmail.com - Run Code
iCloud – Caratteristiche principali
Francesco Novelli
I numeri
- 250 milioni di utenti
- 500 milioni di iOS Device attivi
- 50% degli utenti usa iCloud
francesco.nove@gmail.com - Run Code
iCloud – Caratteristiche principali
Francesco Novelli
- Sincronizzazione automatica
- Implementazione nativa nell’OS
- Risoluzione conflitti automatica
- 5 GB di spazio gratuito
- Disponibile per Mac OS X
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
- Non necessita di framework
- Certificati necessari
- iCloud Storage
- iCloud Key-Value Data Storage
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Certificati:
Entitlement attivo nell’app
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Certificati:
AppID in iOS Dev Portal
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Certificati:
Provisioning Profile dedicato
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
iCloud Data Storage:
Archiviazione file
Salvataggio Database
Salvataggio CoreData
Condivisione file tra devices
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
iCloud Data Storage:
// Controllare che iCloud sia attivo
id currentToken =
[[NSFileManager defaultManager]
ubiquityIdentityToken];
if (!currentToken) {
// Alert user
}
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
self.query = [[NSMetadataQuery alloc] init];
[self.query setSearchScopes:
[NSArray arrayWithObject:
NSMetadataQueryUbiquitousDocumentsScope]];
NSPredicate *pred = [NSPredicate
predicateWithFormat:@"%K like
'Note_*'", NSMetadataItemFSNameKey];
[self.query setPredicate:pred];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
for (NSMetadataItem *item in [query results]) {
NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];
Note *nota = [[Note alloc] initWithFileURL:url];
[nota openWithCompletionHandler:^(BOOL success) {
if (success) {
[self.notes addObject:nota];
}
}];
}
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
// CREARE UN FILE
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"]
URLByAppendingPathComponent:fileName];
Note *nota = [[Note alloc] initWithFileURL:ubiquitousPackage];
[nota saveToURL:[nota fileURL]
forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
if (success) {
[self.notes addObject:nota];
[self.tableView reloadData];
}
}];
];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
DA RICORDARE
- NSFileManager per le operazioni di I/O
- NSMetadataQuery per la ricerca dei file
- I file vengono scaricati solo in caso di
necessità
- Caricare solo le differenze!
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
iCloud Key-Value Storage
Salvataggio impostazioni
Salvataggio stato dell’applicazione
Salvataggio piccoli dati
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Classi ammesse:
• NSData
• NSString
• NSNumber
• NSDate
• NSArray
• NSDictionary
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Scrivere un dato
[[NSUbiquitousKeyValueStore defaultStore]
setObject:@"testo"
forKey:@"key"];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Sincronizzare i dati
[[NSUbiquitousKeyValueStore defaultStore]
synchronize];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
Leggere i dati
NSLog(@"%@",[[NSUbiquitousKeyValueSto
re defaultStore] objectForKey:@"key"]);
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
NSUbiquitousKeyValueStore
==
NSUserDefaults
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
PRO
Profondamente integrato con l’OS
Poco codice e nessuna dipendenza
Compatibilità da iOS 5
Compatibilità perfetta con OS X
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
CONTRO
Disponibile SOLO con device Apple
Sandbox impedisce spazio condiviso
L’utente non può accedere direttamente ai
file
francesco.nove@gmail.com - Run Code
Dropbox
Francesco Novelli
- Caratteristiche principali
- Come implementarlo in un App
- Pro
- Contro
francesco.nove@gmail.com - Run Code
Dropbox– Caratteristiche principali
Francesco Novelli
- 100 milioni di utenti
- Gratis fino a 16 Gb di spazio
- LAN Sync
- Condivisione cartelle tra utenti
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
Registrazione nell’App Console:
https://www.dropbox.com/developers/apps
- APP Type: API
- APP Name Univoco
- Access: App Folder
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli francesco.nove@gmail.com - Run Code
App key
App secret
Dropbox– Come implementarlo in un App
Francesco Novelli
Download Dropbox iOS SDK
https://www.dropbox.com/developers/sync/
tutorial/ios
Dropbox.framework in Xcode
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
Altri framework necessari:
• CFNetwork.framework
• Security.framework
• SystemConfiguration.framework
• QuartzCore.framework
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
#import <Dropbox/Dropbox.h>
- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)opts {
...
// The account manager stores all the account info. Create this when your app launches
DBAccountManager* accountMgr =
[[DBAccountManager alloc] initWithAppKey:@"APP_KEY" secret:@"APP_SECRET"];
[DBAccountManager setSharedManager:accountMgr];
DBAccount *account = accountMgr.linkedAccount;
if (account) {
DBFilesystem *filesystem = [[DBFilesystem alloc] initWithAccount:account];
[DBFilesystem setSharedFilesystem:filesystem];
}
...
}
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
Info.plist
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>db-APP_KEY</string>
</array>
</dict>
</array>
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url
sourceApplication:(NSString *)source annotation:(id)annotation {
DBAccount *account = [[DBAccountManager sharedManager] handleOpenURL:url];
if (account) {
DBFilesystem *filesystem = [[DBFilesystem alloc] initWithAccount:account];
[DBFilesystem setSharedFilesystem:filesystem];
NSLog(@"App linked successfully!");
return YES;
}
...
}
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
// ELENCARE FILE
NSArray *contents =
[[DBFilesystem sharedFilesystem] listFolder:[DBPath root]
error:nil];
for (DBFileInfo *info in contents) {
NSLog(@"%@", info.path);
}
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
// SCRIVERE UN FILE
DBPath *newPath = [[DBPath root] childPath:@"hello.txt"];
DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil];
[file writeString:@"Hello World!" error:nil];
// LEGGERE UN FILE
DBPath *newPath = [[DBPath root] childPath:@"hello.txt"];
DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil];
NSString *fileContent [file readString:@"Hello World!" error:nil];
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un App
Francesco Novelli
// CONTROLLARE LE MODIFICHE
DBPath *path = [[DBPath root] childPath:@"change-me.txt"];
self.file = [[DBFilesystem sharedFilesystem] createFile:path error:nil];
// Next, register for changes on that file
[self.file addObserver:self block:^() {
// This block will be called every time your file changes
// if newerStatus is not nil, it means a newer version is available
DBFileStatus *newerStatus = file.newerStatus;
if (newerStatus) {
if (!newerStatus.cached) {
NSLog(@"newerStatus.cached == NO; this means the file downloading");
} else {
// Update to the newly available version and print it out
[file update:nil];
NSLog(@"The file is done downloading: %@", [file readString:nil]);
}
}
}];
francesco.nove@gmail.com - Run Code
Dropbox - PRO
Francesco Novelli
PRO
Disponibile su tutte le piattaforme
File accessibili da qualsiasi app
Possibilità di ampliare lo spazio
gratuitamente
francesco.nove@gmail.com - Run Code
Dropbox - CONTRO
Francesco Novelli
CONTRO
Necessità di diverse dipendenze
Codice più complesso di iCloud
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
- Caratteristiche principali
- Come implementarlo in un App
- Pro
- Contro
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
- TUTTI hanno un account Google
- Integrato benissimo con Android..
- …ed ha le API per iOS
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
- Registrare l’app nel Google API Console:
https://code.google.com/apis/console/
- Importare svariati framework
- Importare i framework di Google Drive
OPPURE
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
Seguire alla lettera le istruzioni di questa
pagina:
https://developers.google.com/drive/quickst
art-ios
(non il video, l’app non compila!)
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
GTLDriveFile *file = [GTLDriveFile object];
file.title = [dateFormat stringFromDate:[NSDate date]];
file.descriptionProperty = @”Desc";
file.mimeType = @"image/png";
NSData *data = …; // DATA TO UPLOAD
GTLUploadParameters *uploadParameters = [GTLUploadParameters
uploadParametersWithData:data MIMEType:file.mimeType];
GTLQueryDrive *query = [GTLQueryDrive queryForFilesInsertWithObject:file
uploadParameters:uploadParameters];
francesco.nove@gmail.com - Run Code
Google Drive
Francesco Novelli
[self.driveService executeQuery:query
completionHandler:^(GTLServiceTicket *ticket,
GTLDriveFile *insertedFile,
NSError *error) {
if (error == nil)
{
NSLog(@"File ID: %@", insertedFile.identifier);
}
}];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
PRO
Tutti hanno un account Google
Disponibile in tutte le piattaforme
€/Gb più basso della concorrenza
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un App
Francesco Novelli
CONTRO
TANTE dipendenze
Codice complesso
Live Sync non disponibile
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
- Caratteristiche principali
- Come implementarlo in un App
- Pro
- Contro
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
- Spazio dello sviluppatore
- L’utente non ha bisogno di un account
- Servizio totalmente differente dagli altri
- Supporto a CoreData
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
- Scaricare l’SDK dal sito AWS:
http://aws.amazon.com/sdkforios/
- Importare AWSiOSSDK.framework nel
progetto
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
AWSPersistence.framework
CoreData tramite S3, ma ancora in beta
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
self.s3 = [[[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID
withSecretKey:SECRET_KEY] autorelease];
self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2];
S3CreateBucketRequest *createBucketRequest = [[[S3CreateBucketRequest alloc]
initWithName:[Constants pictureBucket] andRegion:[S3Region USWest2]]
autorelease];
S3CreateBucketResponse *createBucketResponse = [self.s3
createBucket:createBucketRequest];
if(createBucketResponse.error != nil)
{
NSLog(@"Error: %@", createBucketResponse.error);
}
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
S3PutObjectRequest *por = [[[S3PutObjectRequest alloc] initWithKey:PICTURE_NAME
inBucket:[Constants pictureBucket]] autorelease];
por.contentType = @"image/jpeg";
por.data = imageData;
S3PutObjectResponse *putObjectResponse = [self.s3 putObject:por];
[self performSelectorOnMainThread:@selector(showCheckErrorMessage:)
withObject:putObjectResponse.error
waitUntilDone:NO];
francesco.nove@gmail.com - Run Code
Amazon S3
Francesco Novelli
S3ResponseHeaderOverrides *override = [[[S3ResponseHeaderOverrides alloc] init] autorelease];
override.contentType = @"image/jpeg";
// Request a pre-signed URL to picture that has been uplaoded.
S3GetPreSignedURLRequest *gpsur =
[[[S3GetPreSignedURLRequest alloc] init] autorelease];
gpsur.key = PICTURE_NAME;
gpsur.bucket = [Constants pictureBucket];
gpsur.expires =
[NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval) 3600];
gpsur.responseHeaderOverrides = override;
// Get the URL
NSError *error;
NSURL *url = [self.s3 getPreSignedURL:gpsur error:&error];
francesco.nove@gmail.com - Run Code
Amazon S3 – PRO
Francesco Novelli
PRO
Spazio praticamente illimitato
Semplice implementazione
File condivisi con tutti
L’utente non ha bisogno di un account
francesco.nove@gmail.com - Run Code
Amazon S3 – CONTRO
Francesco Novelli
CONTRO
Lo spazio non è personale
Per grandi progetti da valutare il €/Gb
Costi per il trasferimento dei file
francesco.nove@gmail.com - Run Code
In conclusione
Francesco Novelli francesco.nove@gmail.com - Run Code
- iCloud per progetti iOS-Only (o Mac)
- Dropbox per applicazioni su più OS
- Google Drive come alternativa a Dropbox
- Amazon S3 per far caricare file all’utente
In conclusione
Francesco Novelli francesco.nove@gmail.com - Run Code
Q&A Time…
francesco.nove@gmail.com
@iF9
www.9lli.it/francesco
www.facebook.com/fnove
In conclusione
Francesco Novelli francesco.nove@gmail.com - Run Code

More Related Content

Similar to Cloud and iOS by Francesco Novelli

Applicazioni mobili: strumenti, costi soluzioni e peformance
Applicazioni mobili: strumenti, costi soluzioni e peformanceApplicazioni mobili: strumenti, costi soluzioni e peformance
Applicazioni mobili: strumenti, costi soluzioni e peformanceDiego La Monica
 
Wearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchWearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchPaolo Musolino
 
Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Todi Appy Days
 
Introduzione a..django
Introduzione a..djangoIntroduzione a..django
Introduzione a..djangoLuca Forzutti
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazioneDaniele Costarella
 
Deftcon 2014 - Mattia Epifani & Claudia Meda - Windows 8 forensics
Deftcon 2014 - Mattia Epifani  & Claudia Meda - Windows 8 forensicsDeftcon 2014 - Mattia Epifani  & Claudia Meda - Windows 8 forensics
Deftcon 2014 - Mattia Epifani & Claudia Meda - Windows 8 forensicsDeft Association
 
Rich Internet Application con Flex, AIR e Java
Rich Internet Application con Flex, AIR e JavaRich Internet Application con Flex, AIR e Java
Rich Internet Application con Flex, AIR e Javamarcocasario
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugianifirenze-gtug
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)Diego La Monica
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodemotion
 
Federico Massi.it - Intro alle app mobile Cordova
Federico Massi.it - Intro alle app mobile CordovaFederico Massi.it - Intro alle app mobile Cordova
Federico Massi.it - Intro alle app mobile CordovaFederico Massi
 
OSINT su siti web
OSINT su siti webOSINT su siti web
OSINT su siti webdalchecco
 
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8Wellnet srl
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8DrupalDay
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOSGaspare Novara
 

Similar to Cloud and iOS by Francesco Novelli (20)

Applicazioni mobili: strumenti, costi soluzioni e peformance
Applicazioni mobili: strumenti, costi soluzioni e peformanceApplicazioni mobili: strumenti, costi soluzioni e peformance
Applicazioni mobili: strumenti, costi soluzioni e peformance
 
Wearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple WatchWearable Lab: Progettazione per Apple Watch
Wearable Lab: Progettazione per Apple Watch
 
Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015Progettazione per Apple Watch - Todi Appy Days 2015
Progettazione per Apple Watch - Todi Appy Days 2015
 
Introduzione a..django
Introduzione a..djangoIntroduzione a..django
Introduzione a..django
 
WordCamp Catania 2019 PWA e TWA
WordCamp Catania 2019 PWA e TWAWordCamp Catania 2019 PWA e TWA
WordCamp Catania 2019 PWA e TWA
 
Linux Embedded per l'automazione
Linux Embedded per l'automazioneLinux Embedded per l'automazione
Linux Embedded per l'automazione
 
Deftcon 2014 - Mattia Epifani & Claudia Meda - Windows 8 forensics
Deftcon 2014 - Mattia Epifani  & Claudia Meda - Windows 8 forensicsDeftcon 2014 - Mattia Epifani  & Claudia Meda - Windows 8 forensics
Deftcon 2014 - Mattia Epifani & Claudia Meda - Windows 8 forensics
 
Rich Internet Application con Flex, AIR e Java
Rich Internet Application con Flex, AIR e JavaRich Internet Application con Flex, AIR e Java
Rich Internet Application con Flex, AIR e Java
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
 
I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)I linguaggi del web - seconda edizione (3° giornata)
I linguaggi del web - seconda edizione (3° giornata)
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
 
Corso dot netnuke
Corso dot netnukeCorso dot netnuke
Corso dot netnuke
 
Corso dot netnuke
Corso dot netnukeCorso dot netnuke
Corso dot netnuke
 
Federico Massi.it - Intro alle app mobile Cordova
Federico Massi.it - Intro alle app mobile CordovaFederico Massi.it - Intro alle app mobile Cordova
Federico Massi.it - Intro alle app mobile Cordova
 
OSINT su siti web
OSINT su siti webOSINT su siti web
OSINT su siti web
 
Programming iOS lezione 4
Programming iOS lezione 4Programming iOS lezione 4
Programming iOS lezione 4
 
Programming iOS lezione 1
Programming iOS lezione 1Programming iOS lezione 1
Programming iOS lezione 1
 
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
Sviluppare app native per iOS
Sviluppare app native per iOSSviluppare app native per iOS
Sviluppare app native per iOS
 

More from Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

More from Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

Cloud and iOS by Francesco Novelli

  • 1. iOS e il Cloud Francesco Novelli francesco.nove@gmail.com - Run Code
  • 2. Chi Sono? Francesco Novelli - iOS Developer - Web Developer - Autore di Programmare applicazioni per iPhone ed iPad -Autore di Programamre applicazioni per Mac OS X francesco.nove@gmail.com - Run Code
  • 3. Chi Sono? Francesco Novelli francesco.nove@gmail.com - Run Code
  • 4. Di cosa parliamo oggi? Francesco Novelli CLOUD! francesco.nove@gmail.com - Run Code
  • 5. Di cosa parliamo oggi? Francesco Novelli e iOS... francesco.nove@gmail.com - Run Code
  • 6. Di cosa parliamo oggi? Francesco Novelli - iCloud - DropBox - Google Drive - Amazon S3 francesco.nove@gmail.com - Run Code
  • 7. iCloud Francesco Novelli - Caratteristiche principali - Come implementarlo in un App - Pro - Contro francesco.nove@gmail.com - Run Code
  • 8. iCloud – Caratteristiche principali Francesco Novelli I numeri - 250 milioni di utenti - 500 milioni di iOS Device attivi - 50% degli utenti usa iCloud francesco.nove@gmail.com - Run Code
  • 9. iCloud – Caratteristiche principali Francesco Novelli - Sincronizzazione automatica - Implementazione nativa nell’OS - Risoluzione conflitti automatica - 5 GB di spazio gratuito - Disponibile per Mac OS X francesco.nove@gmail.com - Run Code
  • 10. iCloud – Come implementarlo in un App Francesco Novelli - Non necessita di framework - Certificati necessari - iCloud Storage - iCloud Key-Value Data Storage francesco.nove@gmail.com - Run Code
  • 11. iCloud – Come implementarlo in un App Francesco Novelli Certificati: Entitlement attivo nell’app francesco.nove@gmail.com - Run Code
  • 12. iCloud – Come implementarlo in un App Francesco Novelli Certificati: AppID in iOS Dev Portal francesco.nove@gmail.com - Run Code
  • 13. iCloud – Come implementarlo in un App Francesco Novelli Certificati: Provisioning Profile dedicato francesco.nove@gmail.com - Run Code
  • 14. iCloud – Come implementarlo in un App Francesco Novelli iCloud Data Storage: Archiviazione file Salvataggio Database Salvataggio CoreData Condivisione file tra devices francesco.nove@gmail.com - Run Code
  • 15. iCloud – Come implementarlo in un App Francesco Novelli iCloud Data Storage: // Controllare che iCloud sia attivo id currentToken = [[NSFileManager defaultManager] ubiquityIdentityToken]; if (!currentToken) { // Alert user } francesco.nove@gmail.com - Run Code
  • 16. iCloud – Come implementarlo in un App Francesco Novelli self.query = [[NSMetadataQuery alloc] init]; [self.query setSearchScopes: [NSArray arrayWithObject: NSMetadataQueryUbiquitousDocumentsScope]]; NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K like 'Note_*'", NSMetadataItemFSNameKey]; [self.query setPredicate:pred]; francesco.nove@gmail.com - Run Code
  • 17. iCloud – Come implementarlo in un App Francesco Novelli for (NSMetadataItem *item in [query results]) { NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; Note *nota = [[Note alloc] initWithFileURL:url]; [nota openWithCompletionHandler:^(BOOL success) { if (success) { [self.notes addObject:nota]; } }]; } francesco.nove@gmail.com - Run Code
  • 18. iCloud – Come implementarlo in un App Francesco Novelli // CREARE UN FILE NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:fileName]; Note *nota = [[Note alloc] initWithFileURL:ubiquitousPackage]; [nota saveToURL:[nota fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { if (success) { [self.notes addObject:nota]; [self.tableView reloadData]; } }]; ]; francesco.nove@gmail.com - Run Code
  • 19. iCloud – Come implementarlo in un App Francesco Novelli DA RICORDARE - NSFileManager per le operazioni di I/O - NSMetadataQuery per la ricerca dei file - I file vengono scaricati solo in caso di necessità - Caricare solo le differenze! francesco.nove@gmail.com - Run Code
  • 20. iCloud – Come implementarlo in un App Francesco Novelli iCloud Key-Value Storage Salvataggio impostazioni Salvataggio stato dell’applicazione Salvataggio piccoli dati francesco.nove@gmail.com - Run Code
  • 21. iCloud – Come implementarlo in un App Francesco Novelli Classi ammesse: • NSData • NSString • NSNumber • NSDate • NSArray • NSDictionary francesco.nove@gmail.com - Run Code
  • 22. iCloud – Come implementarlo in un App Francesco Novelli Scrivere un dato [[NSUbiquitousKeyValueStore defaultStore] setObject:@"testo" forKey:@"key"]; francesco.nove@gmail.com - Run Code
  • 23. iCloud – Come implementarlo in un App Francesco Novelli Sincronizzare i dati [[NSUbiquitousKeyValueStore defaultStore] synchronize]; francesco.nove@gmail.com - Run Code
  • 24. iCloud – Come implementarlo in un App Francesco Novelli Leggere i dati NSLog(@"%@",[[NSUbiquitousKeyValueSto re defaultStore] objectForKey:@"key"]); francesco.nove@gmail.com - Run Code
  • 25. iCloud – Come implementarlo in un App Francesco Novelli NSUbiquitousKeyValueStore == NSUserDefaults francesco.nove@gmail.com - Run Code
  • 26. iCloud – Come implementarlo in un App Francesco Novelli PRO Profondamente integrato con l’OS Poco codice e nessuna dipendenza Compatibilità da iOS 5 Compatibilità perfetta con OS X francesco.nove@gmail.com - Run Code
  • 27. iCloud – Come implementarlo in un App Francesco Novelli CONTRO Disponibile SOLO con device Apple Sandbox impedisce spazio condiviso L’utente non può accedere direttamente ai file francesco.nove@gmail.com - Run Code
  • 28. Dropbox Francesco Novelli - Caratteristiche principali - Come implementarlo in un App - Pro - Contro francesco.nove@gmail.com - Run Code
  • 29. Dropbox– Caratteristiche principali Francesco Novelli - 100 milioni di utenti - Gratis fino a 16 Gb di spazio - LAN Sync - Condivisione cartelle tra utenti francesco.nove@gmail.com - Run Code
  • 30. Dropbox– Come implementarlo in un App Francesco Novelli Registrazione nell’App Console: https://www.dropbox.com/developers/apps - APP Type: API - APP Name Univoco - Access: App Folder francesco.nove@gmail.com - Run Code
  • 31. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code
  • 32. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code App key App secret
  • 33. Dropbox– Come implementarlo in un App Francesco Novelli Download Dropbox iOS SDK https://www.dropbox.com/developers/sync/ tutorial/ios Dropbox.framework in Xcode francesco.nove@gmail.com - Run Code
  • 34. Dropbox– Come implementarlo in un App Francesco Novelli Altri framework necessari: • CFNetwork.framework • Security.framework • SystemConfiguration.framework • QuartzCore.framework francesco.nove@gmail.com - Run Code
  • 35. Dropbox– Come implementarlo in un App Francesco Novelli #import <Dropbox/Dropbox.h> - (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)opts { ... // The account manager stores all the account info. Create this when your app launches DBAccountManager* accountMgr = [[DBAccountManager alloc] initWithAppKey:@"APP_KEY" secret:@"APP_SECRET"]; [DBAccountManager setSharedManager:accountMgr]; DBAccount *account = accountMgr.linkedAccount; if (account) { DBFilesystem *filesystem = [[DBFilesystem alloc] initWithAccount:account]; [DBFilesystem setSharedFilesystem:filesystem]; } ... } francesco.nove@gmail.com - Run Code
  • 36. Dropbox– Come implementarlo in un App Francesco Novelli Info.plist <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>db-APP_KEY</string> </array> </dict> </array> francesco.nove@gmail.com - Run Code
  • 37. Dropbox– Come implementarlo in un App Francesco Novelli - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url sourceApplication:(NSString *)source annotation:(id)annotation { DBAccount *account = [[DBAccountManager sharedManager] handleOpenURL:url]; if (account) { DBFilesystem *filesystem = [[DBFilesystem alloc] initWithAccount:account]; [DBFilesystem setSharedFilesystem:filesystem]; NSLog(@"App linked successfully!"); return YES; } ... } francesco.nove@gmail.com - Run Code
  • 38. Dropbox– Come implementarlo in un App Francesco Novelli // ELENCARE FILE NSArray *contents = [[DBFilesystem sharedFilesystem] listFolder:[DBPath root] error:nil]; for (DBFileInfo *info in contents) { NSLog(@"%@", info.path); } francesco.nove@gmail.com - Run Code
  • 39. Dropbox– Come implementarlo in un App Francesco Novelli // SCRIVERE UN FILE DBPath *newPath = [[DBPath root] childPath:@"hello.txt"]; DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil]; [file writeString:@"Hello World!" error:nil]; // LEGGERE UN FILE DBPath *newPath = [[DBPath root] childPath:@"hello.txt"]; DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil]; NSString *fileContent [file readString:@"Hello World!" error:nil]; francesco.nove@gmail.com - Run Code
  • 40. Dropbox– Come implementarlo in un App Francesco Novelli // CONTROLLARE LE MODIFICHE DBPath *path = [[DBPath root] childPath:@"change-me.txt"]; self.file = [[DBFilesystem sharedFilesystem] createFile:path error:nil]; // Next, register for changes on that file [self.file addObserver:self block:^() { // This block will be called every time your file changes // if newerStatus is not nil, it means a newer version is available DBFileStatus *newerStatus = file.newerStatus; if (newerStatus) { if (!newerStatus.cached) { NSLog(@"newerStatus.cached == NO; this means the file downloading"); } else { // Update to the newly available version and print it out [file update:nil]; NSLog(@"The file is done downloading: %@", [file readString:nil]); } } }]; francesco.nove@gmail.com - Run Code
  • 41. Dropbox - PRO Francesco Novelli PRO Disponibile su tutte le piattaforme File accessibili da qualsiasi app Possibilità di ampliare lo spazio gratuitamente francesco.nove@gmail.com - Run Code
  • 42. Dropbox - CONTRO Francesco Novelli CONTRO Necessità di diverse dipendenze Codice più complesso di iCloud francesco.nove@gmail.com - Run Code
  • 43. Google Drive Francesco Novelli - Caratteristiche principali - Come implementarlo in un App - Pro - Contro francesco.nove@gmail.com - Run Code
  • 44. Google Drive Francesco Novelli - TUTTI hanno un account Google - Integrato benissimo con Android.. - …ed ha le API per iOS francesco.nove@gmail.com - Run Code
  • 45. Google Drive Francesco Novelli - Registrare l’app nel Google API Console: https://code.google.com/apis/console/ - Importare svariati framework - Importare i framework di Google Drive OPPURE francesco.nove@gmail.com - Run Code
  • 46. Google Drive Francesco Novelli Seguire alla lettera le istruzioni di questa pagina: https://developers.google.com/drive/quickst art-ios (non il video, l’app non compila!) francesco.nove@gmail.com - Run Code
  • 47. Google Drive Francesco Novelli GTLDriveFile *file = [GTLDriveFile object]; file.title = [dateFormat stringFromDate:[NSDate date]]; file.descriptionProperty = @”Desc"; file.mimeType = @"image/png"; NSData *data = …; // DATA TO UPLOAD GTLUploadParameters *uploadParameters = [GTLUploadParameters uploadParametersWithData:data MIMEType:file.mimeType]; GTLQueryDrive *query = [GTLQueryDrive queryForFilesInsertWithObject:file uploadParameters:uploadParameters]; francesco.nove@gmail.com - Run Code
  • 48. Google Drive Francesco Novelli [self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFile *insertedFile, NSError *error) { if (error == nil) { NSLog(@"File ID: %@", insertedFile.identifier); } }]; francesco.nove@gmail.com - Run Code
  • 49. iCloud – Come implementarlo in un App Francesco Novelli PRO Tutti hanno un account Google Disponibile in tutte le piattaforme €/Gb più basso della concorrenza francesco.nove@gmail.com - Run Code
  • 50. iCloud – Come implementarlo in un App Francesco Novelli CONTRO TANTE dipendenze Codice complesso Live Sync non disponibile francesco.nove@gmail.com - Run Code
  • 51. Amazon S3 Francesco Novelli - Caratteristiche principali - Come implementarlo in un App - Pro - Contro francesco.nove@gmail.com - Run Code
  • 52. Amazon S3 Francesco Novelli - Spazio dello sviluppatore - L’utente non ha bisogno di un account - Servizio totalmente differente dagli altri - Supporto a CoreData francesco.nove@gmail.com - Run Code
  • 53. Amazon S3 Francesco Novelli - Scaricare l’SDK dal sito AWS: http://aws.amazon.com/sdkforios/ - Importare AWSiOSSDK.framework nel progetto francesco.nove@gmail.com - Run Code
  • 54. Amazon S3 Francesco Novelli AWSPersistence.framework CoreData tramite S3, ma ancora in beta francesco.nove@gmail.com - Run Code
  • 55. Amazon S3 Francesco Novelli self.s3 = [[[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY_ID withSecretKey:SECRET_KEY] autorelease]; self.s3.endpoint = [AmazonEndpoints s3Endpoint:US_WEST_2]; S3CreateBucketRequest *createBucketRequest = [[[S3CreateBucketRequest alloc] initWithName:[Constants pictureBucket] andRegion:[S3Region USWest2]] autorelease]; S3CreateBucketResponse *createBucketResponse = [self.s3 createBucket:createBucketRequest]; if(createBucketResponse.error != nil) { NSLog(@"Error: %@", createBucketResponse.error); } francesco.nove@gmail.com - Run Code
  • 56. Amazon S3 Francesco Novelli S3PutObjectRequest *por = [[[S3PutObjectRequest alloc] initWithKey:PICTURE_NAME inBucket:[Constants pictureBucket]] autorelease]; por.contentType = @"image/jpeg"; por.data = imageData; S3PutObjectResponse *putObjectResponse = [self.s3 putObject:por]; [self performSelectorOnMainThread:@selector(showCheckErrorMessage:) withObject:putObjectResponse.error waitUntilDone:NO]; francesco.nove@gmail.com - Run Code
  • 57. Amazon S3 Francesco Novelli S3ResponseHeaderOverrides *override = [[[S3ResponseHeaderOverrides alloc] init] autorelease]; override.contentType = @"image/jpeg"; // Request a pre-signed URL to picture that has been uplaoded. S3GetPreSignedURLRequest *gpsur = [[[S3GetPreSignedURLRequest alloc] init] autorelease]; gpsur.key = PICTURE_NAME; gpsur.bucket = [Constants pictureBucket]; gpsur.expires = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval) 3600]; gpsur.responseHeaderOverrides = override; // Get the URL NSError *error; NSURL *url = [self.s3 getPreSignedURL:gpsur error:&error]; francesco.nove@gmail.com - Run Code
  • 58. Amazon S3 – PRO Francesco Novelli PRO Spazio praticamente illimitato Semplice implementazione File condivisi con tutti L’utente non ha bisogno di un account francesco.nove@gmail.com - Run Code
  • 59. Amazon S3 – CONTRO Francesco Novelli CONTRO Lo spazio non è personale Per grandi progetti da valutare il €/Gb Costi per il trasferimento dei file francesco.nove@gmail.com - Run Code
  • 60. In conclusione Francesco Novelli francesco.nove@gmail.com - Run Code
  • 61. - iCloud per progetti iOS-Only (o Mac) - Dropbox per applicazioni su più OS - Google Drive come alternativa a Dropbox - Amazon S3 per far caricare file all’utente In conclusione Francesco Novelli francesco.nove@gmail.com - Run Code