SlideShare a Scribd company logo
1 of 40
CORSO BASE IPHONE
       Parte 2
PROGRAMMA DI OGGI




Esempi di Codice
 •   Gli strumenti per la persistenza dei dati su iOS
 •   Interfacciamento con dati esterni (web services)
 •   Cenni di utilizzo di Map Kit e Location APIì


Concetti
 •   Debugging e Testing delle applicazioni per iOS
 •   Distribuzione delle applicazioni su “App Store”
 •   Risorse utili per gli sviluppatori iOS
DATI PERSISTENTI




• Impostazioni Applicazioni

• supporto    SQLlite

• Lettura   Scrittura Files
APPLICATION SETTINGS
       Dati Persistenti
DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE



 Una tecnica per conservare i dati
 dell’utente all’interno della vostra
 applicazione è l’utilizzo del
 “Settings.bundle”, per inserirlo si
 dovrà fare la seguente procedura:

1.Menu File > Nuovo File.
2.Sotto IOS, scegliere Template: Settings Template.
3.assegnare come nome: Settings.bundle.
DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE


Una volta impostato il Settings.bundle e il
root.plist.
Si potrà accedere ai dati conservati con il
seguente snippet:
NSUserDefaults *defaults =
     [NSUserDefaults standardUserDefaults];
[self setShouldPlaySounds:
     [defaults boolForKey:@"miaPreferenza"]];
SQLLITE - USARE IL DATABASE
          Dati Persistenti
DATI PERSISTENTI: SQLLITE



 Un’altra tecnica per conservare dati all’interno delle vostre
 applicazioni IOS è l’utilizzo del supporto sqlLite, integrato nel
 vostro device. Per attivarlo bisogna fare i seguenti passaggi:

1.Importare la libreria “libsqlite3.0.dylib”
2.Definire una classe di accesso ai dati (es. Data.h/m)
3.Creare un database sqlLite (con sqlLite Manager o altri tools)
4.Importare il database creato
5.Accedere ai dati e gestirli dalla vostra APP
DATI PERSISTENTI: SQLLITE


Creare una classe di accesso ai Dati (dati.h)
         #import <Foundation/Foundation.h>
         #import <sqlite3.h>


         @interface Data : NSObject {
         	

 // Lista contenente i dati letti dal database
         	

 NSMutableArray *lista;
         }

         - (id)init:(NSString *)pathDB;
         - (void)caricaValoriDaDB:(NSString *)dbPath;
         - (unsigned)getSize;
         - (id)objectAtIndex:(unsigned)theIndex;

         @property (nonatomic, retain) NSMutableArray *lista;

         @end
DATI PERSISTENTI: SQLLITE


Creare una classe di accesso ai Dati (dati.m)
                  #import "Data.h"

                  static sqlite3 *database = nil;
                  @implementation Data
                  @synthesize lista;
                  // Inizializziamo l'oggetto della classe Data
                  - (id)init:(NSString *)pathDB{
                  	

      // carichiamo i valori dal database
                  	

      [self caricaValoriDaDB:pathDB];
                       return self;
                  }
                  +(void)finalizeStatements {
                  	

      if(database)
                  	

      	

     sqlite3_close(database);
                  }
                  -(void)dealloc {
                  	

      [lista release];
                  	

      [super dealloc];
                  }
                  //..implementazione metodi di lettura...
                  @end
DATI PERSISTENTI: SQLLITE


Creare una classe di accesso ai Dati (dati.m)
- (void)caricaValoriDaDB:(NSString *)dbPath {
	

      NSLog(@"path: %@",dbPath);
	

      // lista temporanea
	

      NSMutableArray *listaTemp = [[NSMutableArray alloc] init];
	

      // Oggetto che contiene i vari elementi
    NSMutableDictionary *dictionary;
	

	

      NSMutableString *idPersona;//id della persona
	

      NSMutableString *nome;//nome della persona
	

      NSMutableString *cognome;//cognome della persona
	

	

      if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
	

      	

        // query che ricava i valori
	

      	

        const char *sql = "select ID, Nome, Cognome from PERSONA";
	

      	

        sqlite3_stmt *selectstmt;
	

      	

	

      	

        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
	

      	

        	

        while(sqlite3_step(selectstmt) == SQLITE_ROW) {
	

      	

        	

        	

      // ricaviamo i valori letti dalla query
	

      	

        	

        	

      idPersona = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];
	

      	

        	

        	

      nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
	

      	

        	

        	

      cognome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
	

      	

        	

        	

      // inseriamo tutti i valori letti in un unico oggetto
	

      	

        	

        	

      dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:idPersona, @"id", nome, @"nome", cognome, @"cognome", nil];
	

      	

        	

        	

      [listaTemp addObject:dictionary];
	

      	

        	

        	

      [dictionary release];
	

      	

        	

        }
	

          	

    }
	

      	

        self.lista = listaTemp;
	

      	

        [listaTemp release];
	

      }
	

      else
	

      	

        sqlite3_close(database);
	

      NSLog(@"tutto ok");
}
DATI PERSISTENTI: SQLLITE




E ora accediamo ai nostri dati da una qualsiasi classe
dell’Applicazione:
//leggiamo il path del database
! NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"persone.sqlite"];
!
! //creiamo la lista degli autori
! dataList = [[Data alloc] init:defaultDBPath];
LAVORARE CON I FILES
      Dati Persistenti
DATI PERSISTENTI: LAVORARE SUI FILES




L’ultimo metodo per la gestione dei dati all’interno della vostra
APP è quello che permette la lettura e la scrittura dei files.

Gli usi sono molteplici, dalla possibilità di inserire informazioni,
fino alla possibilità di conservare immagini scaricate (caching).
DATI PERSISTENTI: LAVORARE SUI FILES



Salvare un NSArray in un file:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME];

[myArray writeToFile:filePath atomically:TRUE];



Leggere un NSArray da un file:
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
 NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME];

 myArray = [NSArray arrayWithContentsOfFile:filePath];
DATI PERSISTENTI: LAVORARE SUI FILES


Verificare se il file Esiste e salvare un immagine:
 if(![[NSFileManager defaultManager] fileExistsAtPath: uniquePath])
    {

        NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL];
        UIImage *image = [[UIImage alloc] initWithData: data];
        image = [self roundCorners: image];
        if([ImageURLString rangeOfString: @".png" options:
NSCaseInsensitiveSearch].location != NSNotFound)
        {
            [UIImagePNGRepresentation(image) writeToFile: uniquePath atomically: YES];
        }
        else if(
                 [ImageURLString rangeOfString: @".jpg" options:
NSCaseInsensitiveSearch].location != NSNotFound ||
                 [ImageURLString rangeOfString: @".jpeg" options:
NSCaseInsensitiveSearch].location != NSNotFound
                 )
        {
            [UIImageJPEGRepresentation(image, 100) writeToFile: uniquePath atomically:
YES];
        }
    }
DATI PERSISTENTI: LAVORARE SUI FILES


Leggere un immagine da un file:

- (UIImage *) getCachedImage: (NSString *) ImageURLString
{
    NSString *filename = [[something unique, perhaps the image name]];
    NSString *uniquePath = [TMP stringByAppendingPathComponent: filename];

    UIImage *image;
    if([[NSFileManager defaultManager] fileExistsAtPath: uniquePath])
    {
         image = [UIImage imageWithContentsOfFile: uniquePath]; // this is the cached
image
    }
    else
    {
         [self cacheImage: ImageURLString];
         image = [UIImage imageWithContentsOfFile: uniquePath];
    }
    return image;
}
LEGGERE DATI DALLA RETE
        Dati Persistenti
LEGGERE DATI DALLA RETE


Il massimo delle potenzialità un’app le raggiunge quanto può
connettersi al web ed acquisire dati direttamente da servizi
esterni come per esempio attraverso i file XML.

Esistono vari framework per ottenere dati dal web (es
ASIHTTPREQUEST) ma la più semplice prevede l’utilizzo di
questo snippet:
  NSURL *URL=[[NSURL alloc] initWithString:stringForURL];
  NSString *results =
       [[NSString alloc] initWithContentsOfURL :URL];

e l’utilizzo di una classe “parser” che prepari un elenco di dati
da un NSString contenente XML
LEGGERE DATI DALLA RETE: UN SEMPLICE PARSER XML (DA STRINGA)


                                    Interfaccia


#import <Foundation/Foundation.h>


@interface XmlServer : NSObject <NSXMLParserDelegate>{


}
//Creiamo un singleton:
+ (id)sharedXmlServer;
LEGGERE DATI DALLA RETE


                                         Implementazione
#import <Foundation/Foundation.h>
#import <Foundation/NSXMLParser.h>

- (void)parserDidStartDocument:(NSXMLParser *)parser{!
!   NSLog(@"found file and started parsing");
}

- (id)parseXMLFileForString:(NSString *)xmlString
{
!
!   NSData *rssXmlData = [rssXmlString dataUsingEncoding: NSUTF8StringEncoding];!
    NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:MYDATA];
    [rssParser setDelegate:self];
!   [rssParser setShouldProcessNamespaces:NO];
!   [rssParser setShouldReportNamespacePrefixes:NO];
!   [rssParser setShouldResolveExternalEntities:NO];
!   [rssParser parse];
!   [rssParser release];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{!!   !
    NSLog(@"found this element: %@", elementName);
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName{
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
!   NSString * errorString = [NSString stringWithFormat:@"Unable parse XML error number:%i )", [parseError code]];
!   NSLog(@"Errore Analisi XML: %@,", errorString, [parseError description]);!
}
INTRODUZIONE AL MAPKIT
       Strumenti Avanzati
MAPKIT


Utilizziamo il MapKit di IOS

Setup (frameworks):
   #ifdef __OBJC__
       #import <Foundation/Foundation.h>
       #import <UIKit/UIKit.h>
       #import <MapKit/MapKit.h>
   #endif




Aggiungiamo i delegati:
 @interface MapViewController : UIViewController <MKMapViewDelegate>
  
 @end
MAPKIT


Inseriamo la Mappa nella nostra View:
            - (void)loadView {
                self.title = @"Mappa";
                MKMapView *map= [[[MKMapView alloc] init] autorelease];
                map.delegate = self;
                map.showsUserLocation = YES;
                self.view = map;
            }


Zoommiamo sulla posizione dell’utente
 - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
     for (MKAnnotationView *annotationView in views) {
         if (annotationView.annotation == mapView.userLocation) {
             MKCoordinateSpan span = MKCoordinateSpanMake(0.3, 0.3);
             MKCoordinateRegion region =
 MKCoordinateRegionMake(mapView.userLocation.coordinate, span);
             [mapView setRegion:region animated:YES];
         }
     }
 }
MAPKIT


Aggiungere pushpin - la classe Annotation
       @interface MobileSchoolAnnotation : NSObject <MKAnnotation>   {
       " CLLocationCoordinate2D coordinate;
       }
        
       @end

      #import "MobileSchoolAnnotation.h"
       
      @implementation MobileSchoolAnnotation
       
      - (id)init {
           coordinate.longitude = -122.084095;
           coordinate.latitude = 37.422006;
           return [super init];
      }
      @synthesize coordinate;
      - (NSString *)title {
           return @"MobileSchool";
      }
      - (NSString *)subtitle {
           return @"Corso IOS!";
      }
      @end
MAPKIT


Aggiungere i pushpin alla nostra Mappa
 [map addAnnotation:[[[MobileSchoolAnnotation alloc] init]
 autorelease]];


Usare i delegati per personalizzare il click sui pushpin:
 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {
     if (annotation == mapView.userLocation) {
         return nil;
     }
     MKPinAnnotationView *pinView =
 [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
     pinView.pinColor = MKPinAnnotationColorPurple;
     pinView.canShowCallout = YES;
     pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
     pinView.animatesDrop = YES;
     return pinView;
 }


 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:
 (UIControl *)control {
 "   [self.navigationController pushViewController:[[[UIViewController alloc] init] autorelease] animated:YES];
 }
MAPKIT TIPS


Creare viste personalizzate per i nostri PushPin
 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id
 <MKAnnotation>)annotation {
     if (annotation == mapView.userLocation) {
         return nil;
     }
     MKAnnotationView *annotationView = [[[MKAnnotationView alloc]
 initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
     annotationView.image = [UIImage imageNamed:@"google.png"];
     annotationView.canShowCallout = YES;
     annotationView.rightCalloutAccessoryView = [UIButton
 buttonWithType:UIButtonTypeDetailDisclosure];
     return annotationView;
 }
DEBUG E TEST DELLE APPS
         Concetti
CONCETTI: DEBUG DELLE APPLICAZIONI




Le nostre applicazioni prima di poter essere distribuite dovranno
essere testate. In tal senso grazie ad Xcode e alla programmazione
Xcode possiamo mettere in atto le nostre tecniche di analisi e
verifica delle applicazioni che dovranno rispecchiare uno schema
simile al seguente per ciascuna delle feature da noi inserite:
     •Verifica funzionale su simulatore
     •Verifica funzionale su terminale
     •Casi Limite (es. verifica input utente/problemi di rete etc.)
Le nostre app se risponderanno positivamente a tutti i test
potranno passare alla fase finale di testing e successivamente alla
pubblicazione sull’AppleStore
CONCETTI: DEBUG DELLE APPLICAZIONI




Durante le fasi di testing, la nostra console di Xcode ci informerà di tutti gli eventi
dell’Applicazione attraverso due tecniche:
•Breakpoint
•NSLog(@”Messagio in console”)
Inoltre potremo attivare la modalità debug (NSZombie) attraverso il menu: Product->Edit
Scheme->Diagnostics (come in figura seguente)
ABILITARE L’NSZOMBIE
        Debug
DISTRIBUZIONE
    Concetti
CONCETTI: DISTRIBUIRE LE APP




Una volta che le nostre applicazioni sono pronte per il
pubblico (o per il cliente) si dovrà procedere alla
“distribuzione”. Per fare ciò vi necessita il certificato di
Distribuzione (ottenibile attraverso l’IOS Provisioning
Profile) e i “mobileProvisioning” certificate.

Esistono 2 tipologie principali di pubblicazione:
•Ad-Hoc
•AppStore
CONCETTI: DISTRIBUIRE LE APP




•La distribuzione ad-hoc: serve per inviare la vostra
applicazione ad una cerchia ristretta di persone (Es. i
vostri amici per fare dei test o il vostro cliente per
l’approvazione).
•La distribuzione AppStore: è l’invio definitivo della
vostra app verso lo store mondiale di apple. in questo
caso la vostra applicazione sarà sottoposta a una
revisione da parte dei tecnici apple e se riceverete esito
positivo potrete vedere e scaricare la vostra app
direttamente dall’AppleStore.
CONCETTI: DISTRIBUZIONE AD-HOC



Per creare una distribuzione Ad-Hoc, vi servirà un certificato di distribuzione
e un MobileProvisioning per la distribuzione AdHoc con allegati i device
mobile (iphone,ipad, ipod) che potranno fare funzionare la vostra app.

Per creare il certificato, aggiungere i device e scaricare il mobile provisioning
dovrete visitare l’IOS provisioning portal (http://developer.apple.com) e
seguire le semplici istruzioni di apple.
1.Per creare la IPA da inviare ai “tester” dovrete
seguire tre semplici passaggi:
2. Duplicare la configurazione “release” e rinominarla
AdHoc-Distrib
3. Variare il certificato di firma con il nuovo
certificato per la distribuzione ad-hoc.
4. Generare l’Archivio.
CONCETTI: DISTRIBUZIONE AD-HOC


Una volta generato l’archivio, potrete accedere
alla vostra “IPA” direttamente dall’organizer.




1.Cliccare su Share
2. Salvare su Disco la vostra “IPA”
3. Inviarla per Email insieme al MobileProvisioning (distribuzione)
4. Attendere i feeback!
CONCETTI: DISTRIBUZIONE AD-HOC



Per distribuire sull’Appstore, vi servirà un certificato di distribuzione
e un MobileProvisioning per la distribuzione AppStore inoltre
dovrete aver testato la vostra applicazione e predisposto
sull’ItunesConnect un’app con lo stesso nome, la stessa versione e
tutte le icone e screenshot necessari che accoglierà la vostra app.

1.Creare l’app su Apple-ItunesConnect
2. Inserire tutte le icone, screenshot e descrizioni
3. Scaricare il certificato di Distribuzione AppStore
4. compilare l’Archivio con il certificato AppStore
(come in passaggi Ad-Hoc)
5.Dall’organizer fare “submit” del pacchetto generato
6.Attendere i feedback da parte di apple
RISORSE UTILI
    Concetti
CONCETTI: RISORSE UTILI




•MobileSchool: http://www.mobileschool.it
•StackOverflow: http://stackoverflow.com/
•Ios Develper library: http://developer.apple.com/library/ios/navigation/
#section=Resource%20Types&topic=Guides

•Itunes Connect: https://itunesconnect.apple.com/
•IPhone Dev Book: www.iphonedevbook.com/
•IphoneDeveloper tips: http://iphonedevelopertips.com/
per informazioni FLT.lab
                                                                                         http://www.fltlab.net
                                                                                                info@fltlab.net




  GRAZIE PER L’ATTENZIONE
Visitate mobileschool.it per scaricare le demo delle applicazioni
                  realizzate durante il corso!

             MobileSchool è un progetto realizzato in collaborazione con Figmenta S.r.l. - copyright 2012 Figmenta

More Related Content

Viewers also liked

Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48hFLT.lab
 
iOS Development - A Beginner Guide
iOS Development - A Beginner GuideiOS Development - A Beginner Guide
iOS Development - A Beginner GuideAndri Yadi
 
ios-mobile-app-development-intro
ios-mobile-app-development-introios-mobile-app-development-intro
ios-mobile-app-development-introRemesh Govind M
 
Introduction to iOS Development
Introduction to iOS DevelopmentIntroduction to iOS Development
Introduction to iOS DevelopmentAsim Rais Siddiqui
 

Viewers also liked (6)

Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
 
iOS Development - A Beginner Guide
iOS Development - A Beginner GuideiOS Development - A Beginner Guide
iOS Development - A Beginner Guide
 
ios-mobile-app-development-intro
ios-mobile-app-development-introios-mobile-app-development-intro
ios-mobile-app-development-intro
 
Mela marcia
Mela marciaMela marcia
Mela marcia
 
iOS Introduction For Very Beginners
iOS Introduction For Very BeginnersiOS Introduction For Very Beginners
iOS Introduction For Very Beginners
 
Introduction to iOS Development
Introduction to iOS DevelopmentIntroduction to iOS Development
Introduction to iOS Development
 

Similar to Corso Iphone in 48h (parte 2)

SQLite in Xamarin.Forms
SQLite in Xamarin.FormsSQLite in Xamarin.Forms
SQLite in Xamarin.FormsGuido Magrin
 
[Objective-C] - 02 Properties e Costruttori
[Objective-C] - 02 Properties e Costruttori[Objective-C] - 02 Properties e Costruttori
[Objective-C] - 02 Properties e CostruttoriJacopo Di Stanislao
 
Programmazione Doc Gest, Codifica
Programmazione   Doc Gest, CodificaProgrammazione   Doc Gest, Codifica
Programmazione Doc Gest, CodificaAlartzero
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Ivan Gualandri
 
EE Incremental Store
EE Incremental StoreEE Incremental Store
EE Incremental Storefirenze-gtug
 
Web advanced-03-d3 js-base
Web advanced-03-d3 js-baseWeb advanced-03-d3 js-base
Web advanced-03-d3 js-baseStudiabo
 
LAP 2 Lezione 8: Properties, Database, Media, Filesystem
LAP 2  Lezione 8: Properties, Database, Media, FilesystemLAP 2  Lezione 8: Properties, Database, Media, Filesystem
LAP 2 Lezione 8: Properties, Database, Media, FilesystemUniversity of Catania
 
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...paolabassi91
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.jsnetmeansnet
 
Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Massimo Bonanni
 
Presentazione Tesi Marco Ventura
Presentazione Tesi Marco VenturaPresentazione Tesi Marco Ventura
Presentazione Tesi Marco Venturaguest335584
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storageameft
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Tsuneo Kurihara
 
Session 02 - schema design e architettura
Session 02 - schema design e architetturaSession 02 - schema design e architettura
Session 02 - schema design e architetturaMongoDB
 
Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!Michael Denny
 

Similar to Corso Iphone in 48h (parte 2) (20)

Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Programming iOS lezione 3
Programming iOS lezione 3Programming iOS lezione 3
Programming iOS lezione 3
 
SQLite in Xamarin.Forms
SQLite in Xamarin.FormsSQLite in Xamarin.Forms
SQLite in Xamarin.Forms
 
[Objective-C] - 02 Properties e Costruttori
[Objective-C] - 02 Properties e Costruttori[Objective-C] - 02 Properties e Costruttori
[Objective-C] - 02 Properties e Costruttori
 
Programmazione Doc Gest, Codifica
Programmazione   Doc Gest, CodificaProgrammazione   Doc Gest, Codifica
Programmazione Doc Gest, Codifica
 
Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4Introduzione alla programmazione Android - Android@tulug lezione 4
Introduzione alla programmazione Android - Android@tulug lezione 4
 
EE Incremental Store
EE Incremental StoreEE Incremental Store
EE Incremental Store
 
Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
 
Web advanced-03-d3 js-base
Web advanced-03-d3 js-baseWeb advanced-03-d3 js-base
Web advanced-03-d3 js-base
 
LAP 2 Lezione 8: Properties, Database, Media, Filesystem
LAP 2  Lezione 8: Properties, Database, Media, FilesystemLAP 2  Lezione 8: Properties, Database, Media, Filesystem
LAP 2 Lezione 8: Properties, Database, Media, Filesystem
 
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...
Progetto e sviluppo di un'applicazione per dispositivi mobili per la visualiz...
 
breve introduzione a node.js
breve introduzione a node.jsbreve introduzione a node.js
breve introduzione a node.js
 
Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)Sviluppare per Microsoft Band - Web Tiles (Preview)
Sviluppare per Microsoft Band - Web Tiles (Preview)
 
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
 
Presentazione Tesi Marco Ventura
Presentazione Tesi Marco VenturaPresentazione Tesi Marco Ventura
Presentazione Tesi Marco Ventura
 
Abusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side StorageAbusing HTML 5 Client-side Storage
Abusing HTML 5 Client-side Storage
 
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
Accelera lo sviluppo con il web framework! Componenti a supporto dello svilup...
 
Session 02 - schema design e architettura
Session 02 - schema design e architetturaSession 02 - schema design e architettura
Session 02 - schema design e architettura
 
Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!Entity Framework 6 for developers, Code-First!
Entity Framework 6 for developers, Code-First!
 
Terza lezioneandroid
Terza lezioneandroidTerza lezioneandroid
Terza lezioneandroid
 

More from FLT.lab

FLTlab Business Presentation 2012
FLTlab Business Presentation 2012FLTlab Business Presentation 2012
FLTlab Business Presentation 2012FLT.lab
 
Google Analytics - intruduzione
Google Analytics - intruduzioneGoogle Analytics - intruduzione
Google Analytics - intruduzioneFLT.lab
 
Flt.lab Business Presentation
Flt.lab Business PresentationFlt.lab Business Presentation
Flt.lab Business PresentationFLT.lab
 
Presentazione Google Analytics
Presentazione Google AnalyticsPresentazione Google Analytics
Presentazione Google AnalyticsFLT.lab
 
Google Maps for your business
Google Maps for your businessGoogle Maps for your business
Google Maps for your businessFLT.lab
 
Presentazione Google
Presentazione GooglePresentazione Google
Presentazione GoogleFLT.lab
 

More from FLT.lab (6)

FLTlab Business Presentation 2012
FLTlab Business Presentation 2012FLTlab Business Presentation 2012
FLTlab Business Presentation 2012
 
Google Analytics - intruduzione
Google Analytics - intruduzioneGoogle Analytics - intruduzione
Google Analytics - intruduzione
 
Flt.lab Business Presentation
Flt.lab Business PresentationFlt.lab Business Presentation
Flt.lab Business Presentation
 
Presentazione Google Analytics
Presentazione Google AnalyticsPresentazione Google Analytics
Presentazione Google Analytics
 
Google Maps for your business
Google Maps for your businessGoogle Maps for your business
Google Maps for your business
 
Presentazione Google
Presentazione GooglePresentazione Google
Presentazione Google
 

Recently uploaded

Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 

Recently uploaded (9)

Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 

Corso Iphone in 48h (parte 2)

  • 2. PROGRAMMA DI OGGI Esempi di Codice • Gli strumenti per la persistenza dei dati su iOS • Interfacciamento con dati esterni (web services) • Cenni di utilizzo di Map Kit e Location APIì Concetti • Debugging e Testing delle applicazioni per iOS • Distribuzione delle applicazioni su “App Store” • Risorse utili per gli sviluppatori iOS
  • 3. DATI PERSISTENTI • Impostazioni Applicazioni • supporto SQLlite • Lettura Scrittura Files
  • 4. APPLICATION SETTINGS Dati Persistenti
  • 5. DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE Una tecnica per conservare i dati dell’utente all’interno della vostra applicazione è l’utilizzo del “Settings.bundle”, per inserirlo si dovrà fare la seguente procedura: 1.Menu File > Nuovo File. 2.Sotto IOS, scegliere Template: Settings Template. 3.assegnare come nome: Settings.bundle.
  • 6. DATI PERSISTENTI: IMPOSTAZIONI APPLICAZIONE Una volta impostato il Settings.bundle e il root.plist. Si potrà accedere ai dati conservati con il seguente snippet: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [self setShouldPlaySounds: [defaults boolForKey:@"miaPreferenza"]];
  • 7. SQLLITE - USARE IL DATABASE Dati Persistenti
  • 8. DATI PERSISTENTI: SQLLITE Un’altra tecnica per conservare dati all’interno delle vostre applicazioni IOS è l’utilizzo del supporto sqlLite, integrato nel vostro device. Per attivarlo bisogna fare i seguenti passaggi: 1.Importare la libreria “libsqlite3.0.dylib” 2.Definire una classe di accesso ai dati (es. Data.h/m) 3.Creare un database sqlLite (con sqlLite Manager o altri tools) 4.Importare il database creato 5.Accedere ai dati e gestirli dalla vostra APP
  • 9. DATI PERSISTENTI: SQLLITE Creare una classe di accesso ai Dati (dati.h) #import <Foundation/Foundation.h> #import <sqlite3.h> @interface Data : NSObject { // Lista contenente i dati letti dal database NSMutableArray *lista; } - (id)init:(NSString *)pathDB; - (void)caricaValoriDaDB:(NSString *)dbPath; - (unsigned)getSize; - (id)objectAtIndex:(unsigned)theIndex; @property (nonatomic, retain) NSMutableArray *lista; @end
  • 10. DATI PERSISTENTI: SQLLITE Creare una classe di accesso ai Dati (dati.m) #import "Data.h" static sqlite3 *database = nil; @implementation Data @synthesize lista; // Inizializziamo l'oggetto della classe Data - (id)init:(NSString *)pathDB{ // carichiamo i valori dal database [self caricaValoriDaDB:pathDB]; return self; } +(void)finalizeStatements { if(database) sqlite3_close(database); } -(void)dealloc { [lista release]; [super dealloc]; } //..implementazione metodi di lettura... @end
  • 11. DATI PERSISTENTI: SQLLITE Creare una classe di accesso ai Dati (dati.m) - (void)caricaValoriDaDB:(NSString *)dbPath { NSLog(@"path: %@",dbPath); // lista temporanea NSMutableArray *listaTemp = [[NSMutableArray alloc] init]; // Oggetto che contiene i vari elementi NSMutableDictionary *dictionary; NSMutableString *idPersona;//id della persona NSMutableString *nome;//nome della persona NSMutableString *cognome;//cognome della persona if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { // query che ricava i valori const char *sql = "select ID, Nome, Cognome from PERSONA"; sqlite3_stmt *selectstmt; if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { while(sqlite3_step(selectstmt) == SQLITE_ROW) { // ricaviamo i valori letti dalla query idPersona = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)]; nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]; cognome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]; // inseriamo tutti i valori letti in un unico oggetto dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:idPersona, @"id", nome, @"nome", cognome, @"cognome", nil]; [listaTemp addObject:dictionary]; [dictionary release]; } } self.lista = listaTemp; [listaTemp release]; } else sqlite3_close(database); NSLog(@"tutto ok"); }
  • 12. DATI PERSISTENTI: SQLLITE E ora accediamo ai nostri dati da una qualsiasi classe dell’Applicazione: //leggiamo il path del database ! NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"persone.sqlite"]; ! ! //creiamo la lista degli autori ! dataList = [[Data alloc] init:defaultDBPath];
  • 13. LAVORARE CON I FILES Dati Persistenti
  • 14. DATI PERSISTENTI: LAVORARE SUI FILES L’ultimo metodo per la gestione dei dati all’interno della vostra APP è quello che permette la lettura e la scrittura dei files. Gli usi sono molteplici, dalla possibilità di inserire informazioni, fino alla possibilità di conservare immagini scaricate (caching).
  • 15. DATI PERSISTENTI: LAVORARE SUI FILES Salvare un NSArray in un file: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME]; [myArray writeToFile:filePath atomically:TRUE]; Leggere un NSArray da un file: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *filePath = [documentsDirectory stringByAppendingPathComponent:FILE_NAME]; myArray = [NSArray arrayWithContentsOfFile:filePath];
  • 16. DATI PERSISTENTI: LAVORARE SUI FILES Verificare se il file Esiste e salvare un immagine: if(![[NSFileManager defaultManager] fileExistsAtPath: uniquePath]) { NSData *data = [[NSData alloc] initWithContentsOfURL: ImageURL]; UIImage *image = [[UIImage alloc] initWithData: data]; image = [self roundCorners: image]; if([ImageURLString rangeOfString: @".png" options: NSCaseInsensitiveSearch].location != NSNotFound) { [UIImagePNGRepresentation(image) writeToFile: uniquePath atomically: YES]; } else if( [ImageURLString rangeOfString: @".jpg" options: NSCaseInsensitiveSearch].location != NSNotFound || [ImageURLString rangeOfString: @".jpeg" options: NSCaseInsensitiveSearch].location != NSNotFound ) { [UIImageJPEGRepresentation(image, 100) writeToFile: uniquePath atomically: YES]; } }
  • 17. DATI PERSISTENTI: LAVORARE SUI FILES Leggere un immagine da un file: - (UIImage *) getCachedImage: (NSString *) ImageURLString { NSString *filename = [[something unique, perhaps the image name]]; NSString *uniquePath = [TMP stringByAppendingPathComponent: filename]; UIImage *image; if([[NSFileManager defaultManager] fileExistsAtPath: uniquePath]) { image = [UIImage imageWithContentsOfFile: uniquePath]; // this is the cached image } else { [self cacheImage: ImageURLString]; image = [UIImage imageWithContentsOfFile: uniquePath]; } return image; }
  • 18. LEGGERE DATI DALLA RETE Dati Persistenti
  • 19. LEGGERE DATI DALLA RETE Il massimo delle potenzialità un’app le raggiunge quanto può connettersi al web ed acquisire dati direttamente da servizi esterni come per esempio attraverso i file XML. Esistono vari framework per ottenere dati dal web (es ASIHTTPREQUEST) ma la più semplice prevede l’utilizzo di questo snippet: NSURL *URL=[[NSURL alloc] initWithString:stringForURL]; NSString *results = [[NSString alloc] initWithContentsOfURL :URL]; e l’utilizzo di una classe “parser” che prepari un elenco di dati da un NSString contenente XML
  • 20. LEGGERE DATI DALLA RETE: UN SEMPLICE PARSER XML (DA STRINGA) Interfaccia #import <Foundation/Foundation.h> @interface XmlServer : NSObject <NSXMLParserDelegate>{ } //Creiamo un singleton: + (id)sharedXmlServer;
  • 21. LEGGERE DATI DALLA RETE Implementazione #import <Foundation/Foundation.h> #import <Foundation/NSXMLParser.h> - (void)parserDidStartDocument:(NSXMLParser *)parser{! ! NSLog(@"found file and started parsing"); } - (id)parseXMLFileForString:(NSString *)xmlString { ! ! NSData *rssXmlData = [rssXmlString dataUsingEncoding: NSUTF8StringEncoding];! NSXMLParser *rssParser = [[NSXMLParser alloc] initWithData:MYDATA]; [rssParser setDelegate:self]; ! [rssParser setShouldProcessNamespaces:NO]; ! [rssParser setShouldReportNamespacePrefixes:NO]; ! [rssParser setShouldResolveExternalEntities:NO]; ! [rssParser parse]; ! [rssParser release]; } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{!! ! NSLog(@"found this element: %@", elementName); } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ } - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ } - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError { ! NSString * errorString = [NSString stringWithFormat:@"Unable parse XML error number:%i )", [parseError code]]; ! NSLog(@"Errore Analisi XML: %@,", errorString, [parseError description]);! }
  • 22. INTRODUZIONE AL MAPKIT Strumenti Avanzati
  • 23. MAPKIT Utilizziamo il MapKit di IOS Setup (frameworks): #ifdef __OBJC__ #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #endif Aggiungiamo i delegati: @interface MapViewController : UIViewController <MKMapViewDelegate>   @end
  • 24. MAPKIT Inseriamo la Mappa nella nostra View: - (void)loadView { self.title = @"Mappa"; MKMapView *map= [[[MKMapView alloc] init] autorelease]; map.delegate = self; map.showsUserLocation = YES; self.view = map; } Zoommiamo sulla posizione dell’utente - (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { for (MKAnnotationView *annotationView in views) { if (annotationView.annotation == mapView.userLocation) { MKCoordinateSpan span = MKCoordinateSpanMake(0.3, 0.3); MKCoordinateRegion region = MKCoordinateRegionMake(mapView.userLocation.coordinate, span); [mapView setRegion:region animated:YES]; } } }
  • 25. MAPKIT Aggiungere pushpin - la classe Annotation @interface MobileSchoolAnnotation : NSObject <MKAnnotation> { " CLLocationCoordinate2D coordinate; }   @end #import "MobileSchoolAnnotation.h"   @implementation MobileSchoolAnnotation   - (id)init { coordinate.longitude = -122.084095; coordinate.latitude = 37.422006; return [super init]; } @synthesize coordinate; - (NSString *)title { return @"MobileSchool"; } - (NSString *)subtitle { return @"Corso IOS!"; } @end
  • 26. MAPKIT Aggiungere i pushpin alla nostra Mappa [map addAnnotation:[[[MobileSchoolAnnotation alloc] init] autorelease]]; Usare i delegati per personalizzare il click sui pushpin: - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation { if (annotation == mapView.userLocation) { return nil; } MKPinAnnotationView *pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease]; pinView.pinColor = MKPinAnnotationColorPurple; pinView.canShowCallout = YES; pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; pinView.animatesDrop = YES; return pinView; } - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped: (UIControl *)control { " [self.navigationController pushViewController:[[[UIViewController alloc] init] autorelease] animated:YES]; }
  • 27. MAPKIT TIPS Creare viste personalizzate per i nostri PushPin - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if (annotation == mapView.userLocation) { return nil; } MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease]; annotationView.image = [UIImage imageNamed:@"google.png"]; annotationView.canShowCallout = YES; annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; return annotationView; }
  • 28. DEBUG E TEST DELLE APPS Concetti
  • 29. CONCETTI: DEBUG DELLE APPLICAZIONI Le nostre applicazioni prima di poter essere distribuite dovranno essere testate. In tal senso grazie ad Xcode e alla programmazione Xcode possiamo mettere in atto le nostre tecniche di analisi e verifica delle applicazioni che dovranno rispecchiare uno schema simile al seguente per ciascuna delle feature da noi inserite: •Verifica funzionale su simulatore •Verifica funzionale su terminale •Casi Limite (es. verifica input utente/problemi di rete etc.) Le nostre app se risponderanno positivamente a tutti i test potranno passare alla fase finale di testing e successivamente alla pubblicazione sull’AppleStore
  • 30. CONCETTI: DEBUG DELLE APPLICAZIONI Durante le fasi di testing, la nostra console di Xcode ci informerà di tutti gli eventi dell’Applicazione attraverso due tecniche: •Breakpoint •NSLog(@”Messagio in console”) Inoltre potremo attivare la modalità debug (NSZombie) attraverso il menu: Product->Edit Scheme->Diagnostics (come in figura seguente)
  • 32. DISTRIBUZIONE Concetti
  • 33. CONCETTI: DISTRIBUIRE LE APP Una volta che le nostre applicazioni sono pronte per il pubblico (o per il cliente) si dovrà procedere alla “distribuzione”. Per fare ciò vi necessita il certificato di Distribuzione (ottenibile attraverso l’IOS Provisioning Profile) e i “mobileProvisioning” certificate. Esistono 2 tipologie principali di pubblicazione: •Ad-Hoc •AppStore
  • 34. CONCETTI: DISTRIBUIRE LE APP •La distribuzione ad-hoc: serve per inviare la vostra applicazione ad una cerchia ristretta di persone (Es. i vostri amici per fare dei test o il vostro cliente per l’approvazione). •La distribuzione AppStore: è l’invio definitivo della vostra app verso lo store mondiale di apple. in questo caso la vostra applicazione sarà sottoposta a una revisione da parte dei tecnici apple e se riceverete esito positivo potrete vedere e scaricare la vostra app direttamente dall’AppleStore.
  • 35. CONCETTI: DISTRIBUZIONE AD-HOC Per creare una distribuzione Ad-Hoc, vi servirà un certificato di distribuzione e un MobileProvisioning per la distribuzione AdHoc con allegati i device mobile (iphone,ipad, ipod) che potranno fare funzionare la vostra app. Per creare il certificato, aggiungere i device e scaricare il mobile provisioning dovrete visitare l’IOS provisioning portal (http://developer.apple.com) e seguire le semplici istruzioni di apple. 1.Per creare la IPA da inviare ai “tester” dovrete seguire tre semplici passaggi: 2. Duplicare la configurazione “release” e rinominarla AdHoc-Distrib 3. Variare il certificato di firma con il nuovo certificato per la distribuzione ad-hoc. 4. Generare l’Archivio.
  • 36. CONCETTI: DISTRIBUZIONE AD-HOC Una volta generato l’archivio, potrete accedere alla vostra “IPA” direttamente dall’organizer. 1.Cliccare su Share 2. Salvare su Disco la vostra “IPA” 3. Inviarla per Email insieme al MobileProvisioning (distribuzione) 4. Attendere i feeback!
  • 37. CONCETTI: DISTRIBUZIONE AD-HOC Per distribuire sull’Appstore, vi servirà un certificato di distribuzione e un MobileProvisioning per la distribuzione AppStore inoltre dovrete aver testato la vostra applicazione e predisposto sull’ItunesConnect un’app con lo stesso nome, la stessa versione e tutte le icone e screenshot necessari che accoglierà la vostra app. 1.Creare l’app su Apple-ItunesConnect 2. Inserire tutte le icone, screenshot e descrizioni 3. Scaricare il certificato di Distribuzione AppStore 4. compilare l’Archivio con il certificato AppStore (come in passaggi Ad-Hoc) 5.Dall’organizer fare “submit” del pacchetto generato 6.Attendere i feedback da parte di apple
  • 38. RISORSE UTILI Concetti
  • 39. CONCETTI: RISORSE UTILI •MobileSchool: http://www.mobileschool.it •StackOverflow: http://stackoverflow.com/ •Ios Develper library: http://developer.apple.com/library/ios/navigation/ #section=Resource%20Types&topic=Guides •Itunes Connect: https://itunesconnect.apple.com/ •IPhone Dev Book: www.iphonedevbook.com/ •IphoneDeveloper tips: http://iphonedevelopertips.com/
  • 40. per informazioni FLT.lab http://www.fltlab.net info@fltlab.net GRAZIE PER L’ATTENZIONE Visitate mobileschool.it per scaricare le demo delle applicazioni realizzate durante il corso! MobileSchool è un progetto realizzato in collaborazione con Figmenta S.r.l. - copyright 2012 Figmenta

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n