Iphone sat extreme, a blog in Italiano

Sguardi

Author: admin
02 2nd, 2012
02 2nd, 2012

In questo tutorial che sto per mostrarvi come creare una semplice estensione Siri(vedi immagine)

Se ti piacciono temi o modelli, pronti per l’uso sono qui. Metti i modelli pronti in / templates / iphone, creare un nuovo progetto utilizzando nic.pl, immettere ”makepacchetto” e la vostra prima estensione Siri. Deb è fatto! Questa opzione è ideale e miglior modo di sviluppare estensioni. Ma questo file zip contiene un esempio di come caricare  (UI fatta da Interface Builder che è il modo più conveniente per creare interfacce utente

Experimental templates for Xcode [mirror] (extract to ~/Library/Developer/Xcode/Templates and restart Xcode)

Requirements

In primo luogo, è necessario avere l’intestazione SiriObjects.h nella directory di lavoro per la vostra estensione Siri. Questa è l’unica cosa che dovete, non ci sono biblioteche, quadri, niente del genere. È possibile utilizzare Xcode o semplicemente il comando ”make” per costruire l’estensione. C’è un Makefile e un progetto Xcode fornito con l’estensione tutorial, modificare questi in base alle proprie esigenze.

Let’s begin

Un’estensione Siri è un cosiddetto ”pacchetto”, che è in realtà una cartella contenente un file binario ”immagine”, una lista proprietà (plist) descrivendolo e può opzionalmente contenere un certo numero di file di supporto (immagini,pennini, qualunque sia ).

Questa estensione Siri contiene una classe “comando” e una classe ”frammento”.I comandi sono utilizzati per l’elaborazione di input da Siri, mentre i frammentivengono utilizzati per la visualizzazione di informazioni.

Quindi cerchiamo di creare due file di Objective-C e le loro file headercorrispondente: HelloCommands e HelloSnippet.

Abbiamo anche bisogno di specificare una cosa importante nellaHelloSnippet-Info.plist. Cioè, il ”principale classe” nome. La classe principale è la classe ”main”, che viene chiamato all’inizio del inizializzazione dell’estensione.Metteremo K3AHelloSnippetExtension lì.

Aprire il file di intestazione e HelloCommands.h HelloSnippet.h e SiriObjects.himportare in alto:

#import “SiriObjects.h”

HelloSnippet.h
Poi, avremo bisogno di dichiarare la classe principale (che abbiamo chiamatoK3AHelloSnippetExtension in precedenza nel plist). Metteremo questo nel file di intestazione HelloSnippet.h.

@interface K3AHelloSnippetExtension : NSObject<SEExtension>

-(id)initWithSystem :( id<SESystem>)system;

-(NSString*)author;
-(NSString*)name;
-(NSString*)description;
-(NSString*)website;

@end

Come potete vedere, la classe principale eredita NSObject e deve essere conforme al protocollo SEExtension. C’è un metodo che si sono tenuti aimplementare: initWithSystem. Questo inizializza il proprio interno e passa lungo ilparametro “sistema”, dove si registra il frammenti e comandi.
Facoltativamente, è possibile anche implementare metodi per restituire il nomedell’estensione, autore, descrizione e URL del sito web.

Dal momento che vogliamo implementare un frammento, abbiamo bisogno diimportare l’intestazione UIKit. Metteremo questa in cima HelloSnippet.h:

#import <UIKit/UIKit.h>

Poi, possiamo dichiarare lo stesso frammento:

@interface K3AHelloSnippet : NSObject<SESnippet> {
UIView* _view;
IBOutlet UIView* _helloNib;
IBOutlet UILabel* _helloLabel;
}

- (id)initWithProperties :( NSDictionary*)props;
- (id)view;

@end

Il frammento di eredita ancora NSObject ma deve essere conforme al protocolloSESnippet. Abbiamo un UIView semplici e un marchio nel nostro file pennino(preparata in anticipo utilizzando InterfaceBuilder) quindi abbiamo bisogno dicreare IBOutlets per questi. Abbiamo anche bisogno di creare due metodi:initWithProperties e vista.

HelloSnippet.mm

Abbiamo tutto pronto per il frammento quindi cerchiamo di attuarla nel fileHelloSnippet.mm. In primo luogo, abbiamo bisogno di importare le intestazioninecessarie, così abbiamo messo questo all’inizio del file:

#import “HelloSnippet.h”
#import “HelloCommands.h”
#import <Foundation/Foundation.h>

Poi, possiamo iniziare ad attuare i singoli metodi:

@implementation K3AHelloSnippet

Cominciamo con il metodo di visualizzazione. Questo è molto semplice:

- (id)view
{
return _view;
}

Restituisce semplicemente _VIEW.

Abbiamo anche bisogno di implementare il metodo dealloc, per pulire dopo che ilframmento è stato respinto.

- (void)dealloc
{
[_view release];
[super dealloc];
}

Abbiamo solo un punto di vista, per questo è molto semplice. Infine, implementeremo initWithProperties.

- (id)initWithProperties:(NSDictionary*)props;
{
if ( (self = [super init]) )
{
if (![[NSBundle bundleForClass:[self class]] loadNibNamed:@”HelloNib” owner:self options:nil])
{
NSLog(@“Warning! Could not load nib file.\n”);
return NO;
}
_view = [_helloNib retain];
[_helloLabel setText:[props objectForKey:@"text"]]; // text from HelloCommands
}
return self;
}

In primo luogo, che noi chiamiamo [super init] e se questo passa attraverso,cercheremo di caricare il file pennino dal nostro pacchetto. Il file pennino si chiama “HelloNib” nel nostro caso. Possiamo anche ottenere il nome del bundleautomaticamente invocando [NSBundle bundleForClass: [classe auto]].
Se tutto è andato bene, siamo in grado di memorizzare la vista caricato dal filepennino. Poi possiamo anche impostare il testo in etichetta dalle proprietà passò a noi in puntelli.Oh, ma siamo quasi dimenticavo una cosa. Abbiamo ancora bisogno di implementare la nostra classe principale, altrimenti tutto questo non funziona!Facciamolo subito.

@implementation K3AHelloSnippetExtension

// required initialization
-(id)initWithSystem:(id<SESystem>)system
{
if ( (self = [super init]) )
{
[system registerCommand:[K3AHelloCommands class]];
[system registerSnippet:[K3AHelloSnippet class]];
}
return self;
}

Questo è abbastanza semplice di nuovo. Siamo solo noi stessi inizializzare e se tutto è OK, si registra il comando e Snippet con il sistema. La nostra classe snippetsi chiama K3AHelloSnippet e la classe di comando è K3AHelloCommands.
È inoltre possibile implementare dell’autore, nome, ecc metodi se si desidera

HelloCommands.h

Questo è tutto bene, ma dove prendiamo le proprietà e come facciamo a dire Siriper visualizzare questo quando in realtà abbiamo bisogno? Queste attivitàvengono gestite nel file HelloCommands.I nostri comandi classe, che abbiamo chiamato K3AHelloCommands ereditanuovo NSObjects e deve essere conforme al protocollo SECommand. L’unico metodo che questo protocollo richiede di essere attuato è handleSpeech. Quindi cerchiamo di dichiararlo nel HelloCommands.h file di intestazione:

@interface K3AHelloCommands : NSObject<SECommand>

-(BOOL)handleSpeech:(NSString*)text tokens:(NSArray*)tokens tokenSet:(NSSet*)tokenset context:(id<SEContext>)ctx;

@end

Quando il metodo handleSpeech viene invocata, viene passato diversi parametri.Il testo è il testo riconosciuto - come stringa. Gettoni è il testo “token” riconosciuto,cioè divisa in singole parole. Tokenset è un insieme di parole riconosciute - soloun semplice elenco di parole che sono state riconosciute. Tu non conosci l’ordine delle parole quando si usano tokenset ma è più veloce quando si desideraeseguire la scansione per la presenza di parole specifiche.

HelloCommands.mm

Il file di intestazione è pronto, lo si può implementare in HelloCommands.mm:

#import “HelloCommands.h”

@implementation K3AHelloCommands

-(void)dealloc
{
[super dealloc];
}

 Ancora una volta, abbiamo bisogno di implementare il metodo dealloc per la pulizia dopo che sono stati licenziati. Non conserviamo niente qui così una semplice chiamata al [dealloc super] è sufficiente.Infine, attuerà il metodo handleSpeech:

-(BOOL)handleSpeech:(NSString*)text tokens:(NSArray*)tokens tokenSet:(NSSet*)tokenset context:(id<SEContext>)ctx
{
// reacts to only one token – “test”
if ([tokenset count] == 1 && [tokenset containsObject:@"test"])
{
// properties for the snippet
NSDictionary* snipProps = [NSDictionary dictionaryWithObject:@"Text passed as a snippet property." forKey:@"text"];

// create an array of views
NSMutableArray* views = [NSMutableArray arrayWithCapacity:1];
[views addObject:[ctx createAssistantUtteranceView:@"Hello Snippet!!"]];
[views addObject:[ctx createSnippet:@"K3AHelloSnippet" properties:snipProps]];

// send views to the assistant
[ctx sendAddViews:views];

// inform the assistant that this is end of the request
[ctx sendRequestCompleted];

return YES; // inform the system that the command has been handled (ignore the original one from the server)
}

return NO;
}

@end

Noi vogliamo creare un’estensione molto semplice, quello che visualizza il nostroè stato tagliato quando diciamo ”test”. In primo luogo, verificare se vi è un solotoken nel set - e se è vero, verificare se è la parola “test”. Se queste condizioni sono soddisfatte, si può dire Siri per visualizzare il nostro snippet e dire qualcosa.Ci sono due modi per farlo - ma dal momento che vogliamo fare due cose alla volta, è meglio prima a preparare e inviare entrambi in un unico comando.Così creiamo una serie di pareri, che saranno titolari di questi. Poi possiamo aggiungere la “vista frase”, che è lo standard fumetto Siri (questo spiega anche Siria dire quello che vogliamo) e anche il nostro snippet che vogliamo Siri per visualizzare all’utente.

What is context?

Questo è tutto bene, ma perché sono questi metodi invitato ctx (“contesto”)?Questo “contesto” è una serie di domande / risposte tra l’utente e Siri. Si può pensare ad essa come l’argomento della conversazione. Fino a quando il metodoviene chiamato sendRequestCompleted, tutte le azioni Siri sono collegati con il contesto attuale. Ad esempio, quando ti dico Siri per impostare il timer, leirisponde: “Per quanto tempo?” e poi si specifica la durata. Una volta che Siri è soddisfatta (o lei rinuncia), finirà il contesto. Senza questa funzione, non avrebbesapere che hai ancora riferimento al timer quando hai detto la sua durata.Quindi, se si desidera creare complessa interazione con Siri, con molte domandee risposte, si può fare anche in un altro thread - basta assicurarsi che il contestorimane lo stesso e chiamare sendRequestCompleted quando hai finito. AltrimentiSiri potrebbe pensare che si vuole ancora continuare.

Finishing

Torniamo al nostro comando semplice. Dopo aver creato il punto di vista nella matrice, possiamo inviare l’intero array di Siri con sendAddViews e dirle cheabbiamo fatto con questo chiamando sendRequestCompleted.Abbiamo quasi finito. L’unica domanda che rimane è - se tornare SI o NO. Se fossimo in grado di gestire la richiesta - torniamo YES. In caso contrario, torniamoNO.

Non si dovrebbe restituire SI se non si è abbastanza sicuri che l’utente volevaproprio interno di rispondere! Perché quando si torna YES, l’azione originale erisposta da Siri si butta via. La nostra semplice estensione è abbastanza sicura: essa restituisce YES solo quando l’utente dice la parola “test” in esclusiva (ma puòessere ripetuta più volte). Siri non gestisce dicendo ”test” o ”test di prova”, ecc.

How to “run”

Non si può ”giocare” o “eseguire” l’estensione dall’interno Xcode direttamente.Dopo aver costruirla (mac + B di scelta rapida o Project-Build) costruirà un bundlecon binario interno probabilmente in DerivedData directory o una directory radice del progetto (questo può essere impostato in impostazioni globali in Xcode schedaLocations). C’è anche la possibilità di creare istruzioni di generazionepersonalizzate in Xcode in cui è possibile ad esempio comprendono l’esecuzionedel vostro script personalizzato che utilizzerà ssh per eliminare pacchetto vecchiosul dispositivo, copiare una nuova costruzione uno sopra e riavviare SpringBoard.Questo può notevolmente migliorare il tempo di iterazione (Sto usando questo per lo sviluppo delle impostazioni fasci così ed è cool - Impostazioni uccide, cancellafascio vecchio, copia oggi, apre le impostazioni da remoto, scorrere verso il basso, test, ancora una volta) - ma vi prego di non chiedere me per le istruzioni di come èindividuale e il mio tempo è limitato. Google, imparare, provare e divertirsi. Qui è uno strumento per aprire le applicazioni sul dispositivo. Inoltre, non dimenticare di firmare il binario all’interno del fascio di ldid-S comando binary.

NOTE
API che hai appena imparato è per la versione 1.0.1 AE. Tutte le estensionisaranno compatibili - ad esempio AE v9.x dovrebbe essere in grado di eseguire i vecchi 1.0.1 estensioni. Sto già lavorando su API che si estendono per permetterele cose più cool (lingue diverse, corrispondenti frasali, espressioni regolari, magarianche elementi di frase corrispondenti, come sostantivi / verbi / preposizioni).Restate sintonizzati, esso sta andando essere interessante! :)

 TRADOTTO DAL SITO
in caso vi servissero aggiornamenti a file o estensioni potremmo sempre rivolgere riferimento a questo link


La sedia rossa

Author: admin
02 2nd, 2012

Gizmodo ha scoperto un importante problema relativo alla sicurezza in iMessage, il nuovo servizio di messaggistica istantanea che Apple ha introdotto con iOS 5. A causa di un bug del sistema operativo è infatti possibile continuare a ricevere messaggi al proprio numero anche dopo aver rimosso la sim dal telefono.

Read the rest of this entry »



02 2nd, 2012