Cloud e iOS - Codemotion2013 Roma

595 views

Published on

Talk su come integrare i migliori servizi di cloud nelle app per iOS: da iCloud a Dropbox, da GDrive a Amazon S3.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
595
On SlideShare
0
From Embeds
0
Number of Embeds
31
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Cloud e iOS - Codemotion2013 Roma

  1. 1. Francesco NovelliiOS e il Cloudfrancesco.nove@gmail.com - Run Code
  2. 2. Chi Sono? Francesco Novelli francesco.nove@gmail.com - Run Code- iOS Developer- Web Developer- Autore di Programmare applicazioni per iPhone ed iPad-Autore di Programamre applicazioni per Mac OS X
  3. 3. Chi Sono?Francesco Novelli francesco.nove@gmail.com - Run Code
  4. 4. Di cosa parliamo oggi?Francesco Novelli francesco.nove@gmail.com - Run CodeCLOUD!
  5. 5. Di cosa parliamo oggi?Francesco Novelli francesco.nove@gmail.com - Run Code e iOS...
  6. 6. Di cosa parliamo oggi? Francesco Novelli francesco.nove@gmail.com - Run Code- iCloud- DropBox- Google Drive- Amazon S3
  7. 7. iCloud Francesco Novelli francesco.nove@gmail.com - Run Code- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
  8. 8. iCloud – Caratteristiche principali Francesco Novelli francesco.nove@gmail.com - Run Code I numeri- 250 milioni di utenti- 500 milioni di iOS Device attivi- 50% degli utenti usa iCloud
  9. 9. iCloud – Caratteristiche principali Francesco Novelli francesco.nove@gmail.com - Run Code- Sincronizzazione automatica- Implementazione nativa nell’OS- Risoluzione conflitti automatica- 5 GB di spazio gratuito- Disponibile per Mac OS X
  10. 10. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code- Non necessita di framework- Certificati necessari- iCloud Storage- iCloud Key-Value Data Storage
  11. 11. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeCertificati: Entitlement attivo nell’app
  12. 12. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeCertificati: AppID in iOS Dev Portal
  13. 13. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeCertificati: Provisioning Profile dedicato
  14. 14. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeiCloud Data Storage: Archiviazione file Salvataggio Database Salvataggio CoreData Condivisione file tra devices
  15. 15. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeiCloud Data Storage: // Controllare che iCloud sia attivoid currentToken =[[NSFileManager defaultManager] ubiquityIdentityToken]; if (!currentToken) { // Alert user }
  16. 16. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Codeself.query = [[NSMetadataQuery alloc] init];[self.query setSearchScopes: [NSArray arrayWithObject: NSMetadataQueryUbiquitousDocumentsScope]];NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K like Note_*", NSMetadataItemFSNameKey];[self.query setPredicate:pred];
  17. 17. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Codefor (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]; } }]; }
  18. 18. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code// 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]; } }]; ];
  19. 19. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code 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!
  20. 20. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeiCloud Key-Value Storage Salvataggio impostazioni Salvataggio stato dell’applicazione Salvataggio piccoli dati
  21. 21. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeClassi ammesse:• NSData• NSString• NSNumber• NSDate• NSArray• NSDictionary
  22. 22. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeScrivere un dato[[NSUbiquitousKeyValueStore defaultStore] setObject:@"testo"forKey:@"key"];
  23. 23. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeSincronizzare i dati[[NSUbiquitousKeyValueStore defaultStore]synchronize];
  24. 24. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeLeggere i datiNSLog(@"%@",[[NSUbiquitousKeyValueStore defaultStore] objectForKey:@"key"]);
  25. 25. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeNSUbiquitousKeyValueStore == NSUserDefaults
  26. 26. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodePRO Profondamente integrato con l’OS Poco codice e nessuna dipendenza Compatibilità da iOS 5 Compatibilità perfetta con OS X
  27. 27. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeCONTRO Disponibile SOLO con device Apple Sandbox impedisce spazio condiviso L’utente non può accedere direttamente aifile
  28. 28. Dropbox Francesco Novelli francesco.nove@gmail.com - Run Code- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
  29. 29. Dropbox– Caratteristiche principali Francesco Novelli francesco.nove@gmail.com - Run Code- 100 milioni di utenti- Gratis fino a 16 Gb di spazio- LAN Sync- Condivisione cartelle tra utenti
  30. 30. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeRegistrazione nell’App Console:https://www.dropbox.com/developers/apps- APP Type: API- APP Name Univoco- Access: App Folder
  31. 31. Dropbox– Come implementarlo in un AppFrancesco Novelli francesco.nove@gmail.com - Run Code
  32. 32. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeApp keyApp secret
  33. 33. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeDownload Dropbox iOS SDKhttps://www.dropbox.com/developers/sync/tutorial/ios Dropbox.framework in Xcode
  34. 34. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeAltri framework necessari:• CFNetwork.framework• Security.framework• SystemConfiguration.framework• QuartzCore.framework
  35. 35. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code#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]; } ...}
  36. 36. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeInfo.plist<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>db-APP_KEY</string> </array> </dict> </array>
  37. 37. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code- (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; } ...}
  38. 38. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code// ELENCARE FILENSArray *contents = [[DBFilesystem sharedFilesystem] listFolder:[DBPath root] error:nil];for (DBFileInfo *info in contents) { NSLog(@"%@", info.path);}
  39. 39. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code// SCRIVERE UN FILEDBPath *newPath = [[DBPath root] childPath:@"hello.txt"];DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil];[file writeString:@"Hello World!" error:nil];// LEGGERE UN FILEDBPath *newPath = [[DBPath root] childPath:@"hello.txt"];DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil];NSString *fileContent [file readString:@"Hello World!" error:nil];
  40. 40. Dropbox– Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run Code// CONTROLLARE LE MODIFICHEDBPath *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]); } } }];
  41. 41. Dropbox - PRO Francesco Novelli francesco.nove@gmail.com - Run CodePRO Disponibile su tutte le piattaforme File accessibili da qualsiasi app Possibilità di ampliare lo spaziogratuitamente
  42. 42. Dropbox - CONTRO Francesco Novelli francesco.nove@gmail.com - Run CodeCONTRO Necessità di diverse dipendenze Codice più complesso di iCloud
  43. 43. Google Drive Francesco Novelli francesco.nove@gmail.com - Run Code- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
  44. 44. Google Drive Francesco Novelli francesco.nove@gmail.com - Run Code- TUTTI hanno un account Google- Integrato benissimo con Android..- …ed ha le API per iOS
  45. 45. Google Drive Francesco Novelli francesco.nove@gmail.com - Run Code- Registrare l’app nel Google API Console: https://code.google.com/apis/console/- Importare svariati framework- Importare i framework di Google Drive OPPURE
  46. 46. Google Drive Francesco Novelli francesco.nove@gmail.com - Run Code Seguire alla lettera le istruzioni di questa pagina:https://developers.google.com/drive/quickst art-ios (non il video, l’app non compila!)
  47. 47. Google Drive Francesco Novelli francesco.nove@gmail.com - Run CodeGTLDriveFile *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];
  48. 48. Google Drive Francesco Novelli francesco.nove@gmail.com - Run Code[self.driveService executeQuery:querycompletionHandler:^(GTLServiceTicket *ticket, GTLDriveFile *insertedFile, NSError *error) { if (error == nil) { NSLog(@"File ID: %@", insertedFile.identifier); }}];
  49. 49. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodePRO Tutti hanno un account Google Disponibile in tutte le piattaforme €/Gb più basso della concorrenza
  50. 50. iCloud – Come implementarlo in un App Francesco Novelli francesco.nove@gmail.com - Run CodeCONTRO TANTE dipendenze Codice complesso Live Sync non disponibile
  51. 51. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run Code- Caratteristiche principali- Come implementarlo in un App- Pro- Contro
  52. 52. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run Code- Spazio dello sviluppatore- L’utente non ha bisogno di un account- Servizio totalmente differente dagli altri- Supporto a CoreData
  53. 53. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run Code- Scaricare l’SDK dal sito AWS: http://aws.amazon.com/sdkforios/- Importare AWSiOSSDK.framework nel progetto
  54. 54. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run Code AWSPersistence.frameworkCoreData tramite S3, ma ancora in beta
  55. 55. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run Codeself.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); }
  56. 56. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run CodeS3PutObjectRequest *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];
  57. 57. Amazon S3 Francesco Novelli francesco.nove@gmail.com - Run CodeS3ResponseHeaderOverrides *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];
  58. 58. Amazon S3 – PRO Francesco Novelli francesco.nove@gmail.com - Run CodePRO Spazio praticamente illimitato Semplice implementazione File condivisi con tutti L’utente non ha bisogno di un account
  59. 59. Amazon S3 – CONTRO Francesco Novelli francesco.nove@gmail.com - Run CodeCONTRO Lo spazio non è personale Per grandi progetti da valutare il €/Gb Costi per il trasferimento dei file
  60. 60. In conclusioneFrancesco Novelli francesco.nove@gmail.com - Run Code
  61. 61. 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
  62. 62. In conclusione Francesco Novelli francesco.nove@gmail.com - Run CodeQ&A Time… francesco.nove@gmail.com @iF9 www.9lli.it/francesco www.facebook.com/fnove

×