Archive for the ‘xcode’ Category

Phonegap Cordova: richiamare l’app mappe nativa in IOS6

Sunday, October 21st, 2012

In un precendente post spiegavo un work-around per richiamare l’app Mappe di google nativa su iOS da una applicazione sviluppata con phonegap: lanciando opportunamente un URL che puntasse al server maps.google.com, si apriva l’app mappe integrata. Il lancio “dell’opportuno URL” consiste in una semplice riga di codice:

[[UIApplication sharedApplication] openURL:url];

Nell’ultima versione del sistema degli iDevice l’applicazione l’app di google è stata sostituita e il comportamento degli URL è cambiato di conseguenza. In IOS6 un url a maps.google.com aprirà il sito di google in Safari. Sarà quindi necessario intercettare tutte le chiamate di apertura URL della webView e sostituire l’url corretto per la versione di  IOS. Gli URL alle mappe nella mia applicazione puntano a maps.apple.com. Il metodo è shouldStartLoadWithRequest che si trova in MainViewController.m (la posizione è cambiata rispetto a phonegap  1.0)

[sourcecode language=”objc”]
– (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType) navigationType {
NSLog(@"link:%@",[[request URL] absoluteString]);
if ([[[request URL] absoluteString] rangeOfString:@"http://maps.apple.com"].location != NSNotFound) {
// Open in native Maps App
if ([[UIDevice currentDevice].systemVersion floatValue] NSLog(@"MAPPE GOOGLE");
NSURL *url=[NSURL URLWithString:[[[request URL] absoluteString] stringByReplacingOccurrencesOfString:@"http://maps.apple.com" withString:@"http://maps.google.com" ]];
[[UIApplication sharedApplication] openURL:url];
} else {
NSLog(@"MAPPE APPLE");
[[UIApplication sharedApplication] openURL:[request URL]];
}
return NO;
}
else
return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
}
[/sourcecode]

[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=1449319548″ width=”121px” height=”240px” scrolling=”no” marginwidth=”0″ marginheight=”0″ frameborder=”0″][/iframe] [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=B008EK6HVY” width=”121px” height=”240px” scrolling=”no” marginwidth=”0″ marginheight=”0″ frameborder=”0″][/iframe] [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=1430239034″ width=”121px” height=”240px” scrolling=”no” marginwidth=”0″ marginheight=”0″ frameborder=”0″][/iframe]

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.