2012 has been the year of cloud. In this tech talk we will talk about the integration of cloud solution with mobile application, focusing on iOS Application. Not only iCloud, but also other cloud solution available for all mobile platform like Amazon S3.
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
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
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
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
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
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