Posts Tagged ‘iOS’

Prima app per android pubblicata

Friday, November 30th, 2012

Normalmente nella mia vita lavorativa quando si discute di applicazioni mobili multipiattaforma, in un modo o nel altro parlo sempre della mia esperienza con PhoneGap (ora Cordova); la mia prima app sull’appStore di Apple (A.I.S.Mo Info)  è stata appunto  sviluppata con questo framework ed era più che altro un esperimento, quasi un Proof Of Concept.

L’app in se stessa è molto semplice,: un insieme di pagine HTML che sfruttano poco le caratteristiche di PhoneGap e con qualche hack per le mappe. La User Interface è molto iOS-like grazie all’utilizzo del framework CSS UIUIKit.

Ci sono stati esperimenti di porting “automatico” usando il servizio PhoneGap build (ora Adobe PhoneGap Build).

Cogliendo l’occasione di un corso di sviluppo Android, ho effettuato il porting dell’applicazione.

Tempo totale: meno di una giornata compreso il tempo di pubblicazione sul PlayStore.

La fase vera di porting e test è stata molto veloce, ho dovuto testare la visualizzazione su diversi dispositivi a mia disposizione,  creare le icone (ho usate le stesse dell’iphone ridimensionate da eclipse) e gli screen shot per il play store.

In due ore e mezzo, mi sono registrato come sviluppatore, ho cercato di capire cosa fosse necessario per pubblicare l’app (testi e screenshot). La creazione del pacchetto di rilascio è molto più semplice, non c’e’ da impazzire con provisioning profiles, certificati e loro relativa importazione (e conflitti);ho quindi firmato il pacchetto creando il Keystore e atteso che l’app fosse disponibile su GooglePlay.

Sicuramente la pubblicazione su PlayStore è molto più “easy” che non su appStore, i tempi di attesa sono molto diversi in quanto il market di android è molto più “libero” e con meno controlli rispetto ad Apple, ma se si volesse pubblicare la propria app anche su altri market Android i tempi di pubblicazione non sarebbero molto diversi da quelli a cui è abituato uno sviluppatore iOS.

 

 

Creare un template in Xcode 4

Wednesday, March 21st, 2012

In questo post vedremo come creare un semplice template Xcode per generare una classe Singleton.
Putroppo non c’e’ un documento ufficiale Apple che spieghi la sintassi di un template, ma si puo’ imparare molto guardando i template forniti con Xcode.

In Xcode 4.3 i template si trovano in

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates

mentre sul vecchio Xcode si trovano in

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates.

Gli “User Templates” si trovano invece in

~/Library/Developer/Xcode/Templates/File Templates

noi creeremo i nostri file in questa directory.

Ogni template è costituito da un insieme di files racchiusi tutti nella stessa directory creata con estensione .xctemplate.

Creare quindi la cartella con “sudo mkdir mySingleton.xctemplate”; tutti i file verrano creati in questa cartella.

Tipicamente sono necessari 4 file per un template:

  • TemplateInfo.plist    TemplateInfo.plist definisce il nuovo template
  • TemplateIcon.icns    Icona  128px X 128px mostrata in xCode
  • ___FILEBASENAME___.h    Header del file da creare
  • ___FILEBASENAME___.m    Implementazione del file da creare

Il template viene definito nel file TemplateInfo.plist; che permette di specificare i file di output,  eventuali input dell’utente
e le variabili da usare durante la creazione dei file.

Ecco come puo’ essere definito il file .plist tipico

[sourcecode language=”xml”]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AllowedTypes</key>
<array>
<string>public.objective-c-source</string>
<string>public.objective-c-plus-plus-source</string>
</array>
<key>DefaultCompletionName</key>
<string>Singleton</string>
<key>Description</key>
<string>Crea una classe singleton</string>
<key>Kind</key>
<string>Xcode.IDEKit.TextSubstitutionFileTemplateKind</string>
<key>MainTemplateFile</key>
<string>___FILEBASENAME___.m</string>
<key>Options</key>
<array>
<dict>
<key>Description</key>
<string>Nome della classe da creare</string>
<key>Identifier</key>
<string>productName</string>
<key>Name</key>
<string>Nome Classe</string>
<key>NotPersisted</key>
<true/>
<key>Required</key>
<true/>
<key>Type</key>
<string>text</string>
</dict>
</array>
<key>Platforms</key>
<array>
<string>com.apple.platform.iphoneos</string>
</array>
<key>SortOrder</key>
<string>1</string>
<key>Summary</key>
<string>Una classe singleton.</string>
</dict>
</plist>
[/sourcecode]

Nella parte <Options> viene definita l’interfaccia utente e le variabili  da richiedere in fase di creazione del nuovo file.

Mentre il file ___FILEBASENAME___.h del header è:

[sourcecode language=”objc”]
/
// ___FILENAME___
// ___PROJECTNAME___
//
// Creato da ___FULLUSERNAME___ il ___DATE___.
// Copyright (c) ___YEAR___ ___ORGANIZATIONNAME___. All rights reserved.
//

@interface ___FILEBASENAMEASIDENTIFIER___ : NSObject {
// qui puoi definire le variabili locali
}

+ (___FILEBASENAMEASIDENTIFIER___ *)shared___FILEBASENAMEASIDENTIFIER___;

// qui puoi definire metodi e proprietà

@end
[/sourcecode]

L’implementazione è invece cosi’ definita:

[sourcecode language=”objc”]
//
// ___FILENAME___
// ___PROJECTNAME___
//
// Creato da ___FULLUSERNAME___ il ___DATE___.
// Copyright (c) ___YEAR___ ___ORGANIZATIONNAME___. All rights reserved.
//

#import "___FILEBASENAME___.h"

@implementation ___FILEBASENAMEASIDENTIFIER___

static ___FILEBASENAMEASIDENTIFIER___ *sharedInstance = nil;

+ (___FILEBASENAMEASIDENTIFIER___ *)shared___FILEBASENAMEASIDENTIFIER___ {
if (sharedInstance == nil) {
sharedInstance = [[super allocWithZone:NULL] init];
}
return sharedInstance;
}

+ (id)allocWithZone:(NSZone *)zone {
return [[self shared___FILEBASENAMEASIDENTIFIER___] retain];
}

– (id)copyWithZone:(NSZone *)zone {
return self;
}

– (id)retain {
return self;
}

– (NSUInteger)retainCount {
return NSUIntegerMax; //denotes an object that cannot be released
}

– (oneway void)release {
//do nothing
}

– (id)autorelease {
return self;
}

@end
[/sourcecode]

Nei file qui presentati vengono utilizzati una serie di tag.  Eccone una preve descrizione

  • ___FILENAME___ il nome del file con estensioni
  • ___FILEBASENAMEASIDENTIFIER___ Il nome senza estensione in C-style
  • ___PROJECTNAME___ Il nome del progetto
  • ___PROJECTNAMEASIDENTIFIER___ Il nome del progetto in C-Style
  • ___USERNAME___ Username breve
  • ___FULLUSERNAME___ Nome utente completo
  • ___ORGANIZATIONNAME___ Nome dell’organizzazione definita in Xcode
  • ___DATE___ Data odierna
  • ___TIME___ Ora corrente
  • ___YEAR___ Anno in formato AAAA

A breve caricherò anche lo zip.

Rilasciato PhoneGap 0.9.6

Sunday, July 3rd, 2011

E’ stato rilasciato PhoneGap 0.9.6. Tanti fix (in particolare uno utile per il mio Aismo Info).

Un warning: leggete bene i metodi che saranno deprecati nella versione 1.0 !!!

Al seguente indirizzo potete trovare l’elenco dei fix rilasciati per ogni sistema.
https://github.com/phonegap/phonegap/blob/master/changes.txt

Phonegap: richiamare l’app mappe dell’iPhone

Wednesday, March 23rd, 2011

Nello sviluppo di una nuova versione dell’applicazione A.I.S.Mo Info, ho voluto inserire una nuova feature per facilitare la ricerca e la localizzazione delle strutture di riferimento (Ospedali e centri medici) che si occupano di diversi aspetti riguardanti la malattia.

Cercando sul wiki di phonegap, si trovano alcuni interventi che spiegano come aprire l’applicazione map con link del tipo “openmap:”  metodi che non sono mai riuscito a far funzionare sul mio dispositivo e soprattutto non funzionano neanche sul simulatore.

Il metodo che ho trovato e implementato, consiste nel modificare il metodo webView nel delegate della applicazione creata, in modo da intercettare il link al sito maps.goggle.com.

[sourcecode language=”objc”]
– (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType) navigationType {
if ([[[request URL] absoluteString] rangeOfString:@"http://maps.google.com].location != NSNotFound) {
// Open in native Maps App
[[UIApplication sharedApplication] openURL:[request URL]];
return NO;
}
else
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
[/sourcecode]

Questo metodo ovviamente funziona solo per iPhone, per android è necessario implementare un qualche altro tipo di meccanismo.
Una nota sul Build service di phonegap: adesso è possibile compilare l’applicazione anche per iOS previo caricamento di un certificato da sviluppatore e di un provisioning profile

[iframe src=”http://rcm-it.amazon.it/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=ac20blo-21&o=29&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=1849515360″ width=”121px” height=”240px” scrolling=”no” marginwidth=”0″ marginheight=”0″ frameborder=”0″] [iframe src=”http://rcm-it.amazon.it/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=ac20blo-21&o=29&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=111815665X” width=”121px” height=”240px” scrolling=”no” marginwidth=”0″ marginheight=”0″ frameborder=”0″]

Phonegap Build Service

Friday, December 10th, 2010

Ho già parlato di phonegap in un precedente post ed essendo un framework, necessita un ambiente di sviluppo per poter creare i pacchetti da rilasciare: grazie a questo servizio “cloud” non sarà piu’ necessario avere hardware e software per rilasciare una applicazione sui vari dispositivi mobili.

Avendo già rilasciato una applicazione basata su phonegap (A.I.S.Mo. Info) per iPhone,  ho riutilizzato quanto in precedenza sviluppato; lo zip contenente tutte le pagine html, i css e il javascript è stato caricato sul sito build.phonegap.com. (del codice originale ho eliminato solo alcuni riferimenti ad admob)

 

Finito l’upload parte automaticamente la compilazione per le 4 piattarforme attualmente supportate (Blackberry,WebOS,android,Symbian)

Dopo qualche minuto il risultato

 

Selezionando il titolo dell’applicazione, è possibile visualizzare e scaricare le applicazioni tramite i QR code

 

Le applicazioni create sono state poi testate su un Nokia e51 (schermo troppo piccolo!!!) e su un Ideos con android 2.2 (ottimo!!)

Mancanze della beta:

  • iOS non ancora supportato
  • non vengono gestiti i certificati per un rilascio definitivo (è una beta e non è fatta per un rilascio effettivo) è necessario quindi abilitare l’esecuzione di applicaizoni non firmate.
  • vari bug in giro (es icone non visualizzate)

C’è da lavorare  ma promette bene.