View
374
Download
3
Category
Tags:
Preview:
DESCRIPTION
Talk su come integrare i migliori servizi di cloud nelle app per iOS: da iCloud a Dropbox, da GDrive a Amazon S3.
Citation preview
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
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
iCloudFrancesco Novelli
- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
francesco.nove@gmail.com - Run Code
iCloud – Caratteristiche principaliFrancesco 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 principaliFrancesco 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 AppFrancesco 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 AppFrancesco Novelli
Certificati:Entitlement attivo nell’app
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Certificati:AppID in iOS Dev Portal
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Certificati:Provisioning Profile dedicato
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
iCloud Data Storage:Archiviazione fileSalvataggio DatabaseSalvataggio CoreDataCondivisione file tra devices
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco Novelli
iCloud Key-Value StorageSalvataggio impostazioniSalvataggio stato dell’applicazioneSalvataggio piccoli dati
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Classi ammesse:• NSData• NSString• NSNumber• NSDate• NSArray• NSDictionary
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Scrivere un dato
[[NSUbiquitousKeyValueStore defaultStore]
setObject:@"testo" forKey:@"key"];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Sincronizzare i dati
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
Leggere i dati
NSLog(@"%@",[[NSUbiquitousKeyValueStore defaultStore] objectForKey:@"key"]);
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
NSUbiquitousKeyValueStore
==
NSUserDefaults
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
PROProfondamente integrato con l’OSPoco codice e nessuna dipendenzaCompatibilità da iOS 5Compatibilità perfetta con OS X
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
CONTRODisponibile SOLO con device
AppleSandbox impedisce spazio
condivisoL’utente non può accedere
direttamente ai file
francesco.nove@gmail.com - Run Code
DropboxFrancesco Novelli
- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
francesco.nove@gmail.com - Run Code
Dropbox– Caratteristiche principaliFrancesco 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 AppFrancesco 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 AppFrancesco Novelli francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un AppFrancesco Novelli francesco.nove@gmail.com - Run Code
App keyApp secret
Dropbox– Come implementarlo in un AppFrancesco Novelli
Download Dropbox iOS SDKhttps://www.dropbox.com/developers/sync/tutorial/ios
Dropbox.framework in Xcode
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un AppFrancesco Novelli
Altri framework necessari:• CFNetwork.framework• Security.framework• SystemConfiguration.framework• QuartzCore.framework
francesco.nove@gmail.com - Run Code
Dropbox– Come implementarlo in un AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 AppFrancesco 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 - PROFrancesco Novelli
PRODisponibile su tutte le piattaformeFile accessibili da qualsiasi appPossibilità di ampliare lo spazio
gratuitamente
francesco.nove@gmail.com - Run Code
Dropbox - CONTROFrancesco Novelli
CONTRONecessità di diverse dipendenzeCodice più complesso di iCloud
francesco.nove@gmail.com - Run Code
Google DriveFrancesco Novelli
- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
francesco.nove@gmail.com - Run Code
Google DriveFrancesco Novelli
- TUTTI hanno un account Google- Integrato benissimo con Android..- …ed ha le API per iOS
francesco.nove@gmail.com - Run Code
Google DriveFrancesco 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 DriveFrancesco Novelli
Seguire alla lettera le istruzioni di questa pagina:
https://developers.google.com/drive/quickstart-
ios
(non il video, l’app non compila!)
francesco.nove@gmail.com - Run Code
Google DriveFrancesco 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 DriveFrancesco Novelli
[self.driveService executeQuery:querycompletionHandler:^(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 AppFrancesco Novelli
PROTutti hanno un account GoogleDisponibile in tutte le piattaforme€/Gb più basso della concorrenza
francesco.nove@gmail.com - Run Code
iCloud – Come implementarlo in un AppFrancesco Novelli
CONTROTANTE dipendenzeCodice complessoLive Sync non disponibile
francesco.nove@gmail.com - Run Code
Amazon S3Francesco Novelli
- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
francesco.nove@gmail.com - Run Code
Amazon S3Francesco 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 S3Francesco Novelli
- Scaricare l’SDK dal sito AWS:
http://aws.amazon.com/sdkforios/
- Importare AWSiOSSDK.framework nel progetto
francesco.nove@gmail.com - Run Code
Amazon S3Francesco Novelli
AWSPersistence.framework
CoreData tramite S3, ma ancora in beta
francesco.nove@gmail.com - Run Code
Amazon S3Francesco 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 S3Francesco 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 S3Francesco 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 URLNSError *error;NSURL *url = [self.s3 getPreSignedURL:gpsur error:&error];
francesco.nove@gmail.com - Run Code
Amazon S3 – PROFrancesco Novelli
PROSpazio praticamente illimitatoSemplice implementazioneFile condivisi con tuttiL’utente non ha bisogno di un
account
francesco.nove@gmail.com - Run Code
Amazon S3 – CONTROFrancesco Novelli
CONTROLo spazio non è personalePer grandi progetti da valutare il
€/GbCosti per il trasferimento dei file
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 conclusioneFrancesco Novelli francesco.nove@gmail.com - Run Code
Q&A Time…francesco.nove@gmail.com
@iF9www.9lli.it/francesco
www.facebook.com/fnove
In conclusioneFrancesco Novelli francesco.nove@gmail.com - Run Code
Recommended