Archivio mensile:Marzo 2011

Tutorial: Splash Screen per Iphone Apps

Generalmente basta utilizzare un immagine png predefinita per mostrare uno splash screen durante la fase di caricamento dell’applicazione.
Per far questo basta mettere un’immagine chiamata Default.png e magicamente quando clicchiamo sull’icona dell’applicazione sul nostro iphone, il dispositivo va a cercare l’immagine e a mostrarla per la durata dell’inizializzazione dell’applicazione.

Secondo le guidelines e le best practises non andrebbe mostrato nessuno splash screen perche l’applicazione dovrebbe caricarsi nel minor tempo possibile, e non è corretto ritardare lo startup per mostrare questo tipo di immagini.

In realtà questo non avviene quasi mai, e comunque abbiamo bisogno quasi sempre di mostrare il titolo, e qualche credit in fase di startup della nostra iphone App e una progress bar, e magari lasciare per qualche secondo visibile questo splash screen indipendentemente da quanto ci mette l’app a caricarsi (per mostrare il logo di chi l’ha realizzata etc etc)..

In questo tutorial andiamo a realizzare un semplice approccio per la definizione di un protocol che descriva il comportamento generico di uno splashscreen e implementarlo nel nostro Application Delegate.

Innanzitutto creiamo un nuovo progetto iOS Application da XCode, selezionando il modello Navigation-based Application

Ora andiamo nel progetto appena creato, e aggiungiamo nelle Classes un oggetto di tipo Objective-C Protocol e lo chiamiamo splash.

Nel codice generato, aggiungiamo i due metodi che descrivono l’interfaccia standard di un oggetto che utilizza lo splashScreen.

1
2
3
4
5
6
7
8
#import <UIKit/UIKit.h>
@protocol Splash

- (void)showSplash;

- (void)hideSplash;

@end

 

Ora che abbiamo definito il protocol per lo splash, andiamo a modificare il nostro application Delegate, per definire nell’interfaccia , che utilizza il protocol creato, e aggiungere il riferimento alla view che l’applicazione utilizzerà per mostrare lo splash.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#import <UIKit/UIKit.h>

#include "splash.h"

@interface splashTutorialAppDelegate : NSObject <UIApplicationDelegate,Splash> {

UIWindow *window;

UINavigationController *navigationController;

IBOutlet UIView *splashView;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

Ora andiamo nell’implementazione del App delegate, e aggiungiamo l’implementazione dei due metodi definiti nel protocol Splash, e mettiamo il codice di startup nello splash nel metodo di fine caricamento applicazione.

Per mostrare lo splash creiamo a runtime un modalViewController  e scheduliamo un selector che punti al metodo hideSplash, temporizzandolo, ad esempio ad un secondo (cosi attendiamo il tempo di caricamento effettivo dell’applicazione, piu un secondo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#import "splashTutorialAppDelegate.h"

#import "RootViewController.h"

@implementation splashTutorialAppDelegate

@synthesize window;

@synthesize navigationController;

#pragma mark -

#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

// Add the navigation controller's view to the window and display.

[self.window addSubview:navigationController.view];

[self.window makeKeyAndVisible];

[self showSplash];

return YES;

}

-(void)showSplash

{

NSLog(@"show Splash");

UIViewController *modalViewController = [[UIViewController alloc] init];

modalViewController.view = splashView;

[navigationController presentModalViewController:modalViewController animated:NO];

[self performSelector:@selector(hideSplash) withObject:nil afterDelay:1.0];

[modalViewController release];

}

//hide splash screen

- (void)hideSplash{

NSLog(@"hide Splash");

[[navigationController modalViewController] dismissModalViewControllerAnimated:YES];

}



- (void)applicationWillResignActive:(UIApplication *)application {

/*

Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.

*/


}



- (void)applicationDidEnterBackground:(UIApplication *)application {

/*

Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

If your application supports background execution, called instead of applicationWillTerminate: when the user quits.

*/


}



- (void)applicationWillEnterForeground:(UIApplication *)application {

/*

Called as part of  transition from the background to the inactive state: here you can undo many of the changes made on entering the background.

*/


}



- (void)applicationDidBecomeActive:(UIApplication *)application {

/*

Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

*/


}



- (void)applicationWillTerminate:(UIApplication *)application {

/*

Called when the application is about to terminate.

See also applicationDidEnterBackground:.

*/


}



#pragma mark -

#pragma mark Memory management



- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {

/*

Free up as much memory as possible by purging cached data objects that can be recreated (or reloaded from disk) later.

*/


}



- (void)dealloc {

[navigationController release];

[window release];

[super dealloc];

}



@end

 

Ora che il codice è pronto, andiamo a modificare la View nell’interface Builder.

Apriamo quindi la MainWindow.xib e aggiungiamo una UiView e agganciamola con l’outlet splashView richiesta dal nostro ApplicationDelegate .

Quando verrà eseguito lo showSplash, verrà resa modale questa view per il tempo prefissato.

Ora torniamo su XCode e eseguiamo nel simulatore l’applicazione e vedremo comparire lo splash per un secondo circa e poi la view principale .

Scarica i Sorgenti Tutorial SplashScreen

 

Worms of the earth – The Dagon’s Moor

Sesto pezzo del disco.

Il titolo prende spunto dalla brughiera di Dagon, dove si nasconde Atla la Strega.

Bran , alla ricerca dei Vermi della Terra, fuggendo da Eboracum, si inoltra nella brughiera, alla ricerca della residenza della donna lupo, l’unica in grado di rivelargli il segreto dell’antico popolo serpente.

Anche in questo caso Howard cita il pantheon degli dei di R’lyeh, nominando Dagon, che poi è ispirato al culto del dio Dagon, gia presente nel culto dei cananei (nella terra di canaan).

Lonely, with my Shadow, the ligh of a Moon
While the romans are watching my shoulder
I’m a Stalker in the moor

Solitario, con la mia ombra e la luce di una  luna..

Mentre i romani guardano le mie spalle (in modo sarcastico, in quanto è inseguito dai romani che però non si addentrano nella cupa brughiera), sono un predatore nella brughiera.

The Sound of my horse
Remember my tribe
Remember Barbarian’s Lives

Il suono del mio cavallo, riporta alla memoria la mia tribù, la mia vita da barbaro..

I’m Searching for you
The Witch of the Wolves
That howls at my doom

Cerco te, la strega dei lupi (Atla e’ una donna licantropa) , che ulula al mio destino..

Running fast
Covered by Ancient Mist
In the Dagon’s Moor

Find the Answer to the mistery
In the Dagon’s Moor

Corri veloce, nascosto da antiche nebbie, nella brughiera di Dagon..

Cerca la risposta al mistero, nella brughiera di Dagon..

Hide you shadow from the sun
While the BagPipes playing around
Run Bran, Run Bran ,run bran run bran run bran Run.

Nascondi la tua ombra dalla luce del sole, mentre le cornamusa suonano intorno a te (è un riferimento ai guerrieri gaelici di Cormack, che attende nel Vallo di Adriano), corri Bran corri..

Watch a light in the moor
The House of the witch
I’m just reaching my doom

Bran finalmente arriva alla capanna di Atla..

Guarda.. una luce nella brughiera, è la casa della strega.. Sto per raggiungere il mio fato..

Qui , si svolge in maniera veloce e frenetica l’incontro con Atla..

Speak, you know what i want
The gate to the abyss
The Entrance of hell

Parla, tu sai cosa cerco, il cancello per l’abisso, l’entrata per l’inferno ( in riferimento all’entrata verso il mondo sotterraneo in cui si sono rifugiati i Vermi della Terra)..

Hear, The power of Hate
I must find the ring
That connects the two planes

Ascolta la forza del mio odio, Devo trovare l’anello che connette i due piani (come a volersi riferire al popolo serpente come ad un popolo sovrannaturale, mistico)

Feel,The Blood in my veins
The kiss of a King
Is the pay for your aid..

Senti il sangue nelle mie vene, il bacio di un Re è il premio per il tuo aiuto..

Atla vuole passare la notte con Bran, in cambio del suo aiuto..

Fortunatamente per Bran, è una bellissima donna , quando si trova nella forma umana..

In questo pezzo Bran quindi viene a sapere dove si trova l’entrata per il mondo dei Vermi, e cosa deve fare..

Rubare la pietra nera, loro feticcio, e costringerli a ubbidire ai suoi comandi per riaverla.. Solo cosi potrà coinvolgerli nelle vicende terrestri.. Ma Atla lascia anche un monito .. una volta invocati , i Vermi rimarranno indissolubilmente vincolati a lui, e lui a loro, in un legame di sangue..

La sete di vendetta di Bran è tale da non fargli considerare altro che la fame di rivalsa..

Deve prevalere su Roma..

Deve liberare il suo popolo nascente dal triste presente..

Primi passi con C# e WCF : (2) Webservice di backend

Definizione del WebService

Partiamo implementando la parte di backend dei servizi, e cioe il webservice che ci fornirà i dati utente.

Questo webservice si basa su un interfaccia molto semplice.

Apriamo visual studio 2010 e creiamo una progetto Visual C# di tipo Applicazione servizio Web ASP.NET

Una volta creato il progetto ci troveremo di fronte all’implementazione del webservice con il metodo HelloWorld.

Modifichiamo il webservice per aggiungere i metodi pubblici necessari a soddisfare le nostre richieste.

Il Webservice che andiamo a realizzare è composto da alcuni webmethod:

  • uno per l’acquisizione dei dati anagrafici utente
  • uno per acquisizione dell’elenco dei movimenti per utente

Andiamo quindi a definire gli oggetti che ci interessano creando un folder dto (data transfer objects) nella nostra soluzione.

Aggiungiamo quindi un nuovo elemento di tipo File di Codice, per il PersonaDto:

Mettiamo gli attributi necessari alla descrizione dei dati anagrafici dell’entità Persona:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;

using System.Data;

namespace DTOWebServices

{

public class PersonaDTO

{
public int UserId { get; set; }

public string Username{ get; set; }

public string Nome { get;set;}

public string Cognome { get; set; }

public DateTime DataNascita { get; set; }

public string CittaResidenza { get; set; }

public string IndirizzoResidenza { get; set; }

public string CAPResidenza { get; set; }

public string ProvinciaResidenza { get; set; }

}

}
Nella stessa maniera creiamo un MovimentoDto cosi composto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
using System.Data;

namespace DTOWebServices

{

public class MovimentoDTO

{

public int UserId { get; set; }

public int IdMovimento { get; set; }

public DateTime DataMovimento { get; set; }

public string Descrizione { get; set; }

public Double Valore { get; set; }

}

}


Ora che abbiamo definito i Dto, andiamo a creare i WebMethod nel nostro webservice.

Andiamo a definire un getPersona webmethod e un getMovimenti webmethod cosi composti:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
[WebMethod]

public PersonaDTO getPersona(string username)

{

if (username.Equals("kiraya"))

{

return new PersonaDTO

{

UserId = 1,

Username = "kiraya",

Nome = "Andrea",

Cognome = "Magini",

DataNascita = new DateTime(1966,6,6),

IndirizzoResidenza = "Via Proxy 666",

ProvinciaResidenza ="HL",

CittaResidenza ="HELL",

CAPResidenza="00666"

};

}

if (username.Equals("test"))

{

return new PersonaDTO

{

UserId = 2,

Username = "test",

Nome = "TestNome",

Cognome = "TestCognome",

DataNascita = new DateTime(1980,12, 1),

IndirizzoResidenza = "Via test xxx",

ProvinciaResidenza = "RM",

CittaResidenza = "ROMA",

CAPResidenza = "00141"

};

}

return null;

}

[WebMethod]

public MovimentoDTO[] getMovimenti(int userid)

{

MovimentoDTO[] listaMovimenti = new MovimentoDTO[3] ;

listaMovimenti[0] = new MovimentoDTO();

listaMovimenti[0].UserId = userid;

listaMovimenti[0].IdMovimento = 1;

listaMovimenti[0].DataMovimento = DateTime.Parse("01/01/2010");

listaMovimenti[0].Descrizione = "primo movimento";

listaMovimenti[0].Valore = 50000;

listaMovimenti[1] = new MovimentoDTO();

listaMovimenti[1].UserId = userid;

listaMovimenti[1].IdMovimento = 2;

listaMovimenti[1].DataMovimento = DateTime.Parse("02/01/2010");

listaMovimenti[1].Descrizione = "secondo movimento";

listaMovimenti[1].Valore = 22000;

listaMovimenti[2] = new MovimentoDTO();

listaMovimenti[2].UserId = userid;

listaMovimenti[2].IdMovimento = 3;

listaMovimenti[2].DataMovimento = DateTime.Parse("03/01/2010");

listaMovimenti[2].Descrizione = "terzo movimento";

listaMovimenti[2].Valore = 12000;

return listaMovimenti;

}

}

con questi piccoli passi siamo in grado di esporre due metodi che tornano dei dati statici che utilizzeremo nello strato di business logic.

Lanciando in debug la solution, siamo subito in grado di generare il webservice e testarlo in modo molto semplice ed efficace.

Scarica la Solution