iOS Plugins
Un plugin è una classe di Objective-C che estende la CDVPlugin
classe.
Ogni classe plugin deve essere registrato come un <feature>
taggare nella config.xml
file. È attraverso questo meccanismo che JavaScript exec
del metodo service
parametro esegue il mapping a una classe Objective-C.
Classe plugin Mapping
La parte di JavaScript di un plugin utilizza sempre il cordova.exec
metodo come segue:
exec(<successFunction>, <failFunction>, <service>, <action>, [<args>]);
Questo esegue il marshalling di una richiesta dalla UIWebView
sul lato nativo di iOS, più o meno bollente fino a chiamare il action
metodo sul service
classe, con gli argomenti passati nella args
matrice.
Specificare il plugin come un <feature>
tag nel progetto dell'applicazione Cordova-iOS config.xml
file.
<feature name="LocalStorage">
<param name="ios-package" value="CDVLocalStorage" />
</feature>
La caratteristica name
attributo deve corrispondere a quello che si utilizza in JavaScript exec
di chiamata service
parametro e il value
attributo deve corrispondere al nome della classe Objective-C del plugin. <param name>
io dovrei essere sempre "ios-package"
. Se non si segue questa impostazione, il plugin può compilare, ma non sarà raggiungibile da Cordova.
Durata e inizializzazione di Plugin
Viene creata un'istanza di un oggetto plugin per la vita di ogni UIWebView
. Plugin non vengono create istanze fino a quando essi fanno riferimento in primo luogo una chiamata da JavaScript, a meno che non <param>
con un onload
name
attributo è impostato su "true"
in config.xml
. Per esempio:
<feature name="Echo">
<param name="ios-package" value="Echo" />
<param name="onload" value="true" />
</feature>
Non c'è nessun designato inizializzatore per i plugin. Plugin necessario utilizzare invece il pluginInitialize
metodo per la loro logica di avviamento.
Plugin con richieste di lunga durata, sfondo attività (per esempio, riproduzione multimediale), ascoltatori o stato interno dovrebbe implementare il onReset
metodo e interrompere o ripulire tali attività. Questo metodo viene eseguito quando il UIWebView
si sposta su una nuova pagina o rinfresca, che ricarica il JavaScript.
Scrivendo un iOS Cordova Plugin
Abbiamo JavaScript fuoco fuori una richiesta di plugin al lato nativo. Abbiamo il plugin iOS Objective C mappato correttamente tramite il config.xml
file. Così ciò che fa apparire l'iOS finale classe Objective C Plugin come?
Che cosa ottiene spedito al plugin tramite di JavaScript exec
funzione viene passato la classe corrispondente Plugin action
metodo. Un metodo di plugin ha questa firma:
- (void)myMethod:(CDVInvokedUrlCommand*)command
{
CDVPluginResult* pluginResult = nil;
NSString* myarg = [command.arguments objectAtIndex:0];
if (myarg != nil) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Arg was null"];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
iOS CDVPluginResult tipi di messaggio
Utilizzando CDVPluginResult è possibile restituire una varietà di tipi di risultato al vostro callback JavaScript, utilizzando i metodi della classe che sembrano:
+ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAs...
È possibile creare String
, Int
, Double
, Bool
, Array
, Dictionary
, ArrayBuffer
, e Multipart
tipi. O, non allegare eventuali argomenti (basta inviare uno status). O, per restituire un errore. Può anche scegliere di non inviare alcun risultato plugin a tutti, nel qual caso non viene generato il callback.
Note
-
messageAsArrayBuffer
si aspettaNSData*
e la converte in unArrayBuffer
per il callback di JavaScript (eArrayBuffers
inviati a un plugin da JavaScript vengono convertiti inNSData*
). -
messageAsMultipart
si aspetta unNSArray *
contenente uno qualsiasi degli altri supportati i tipi e manda l'intera matrice come ilargomenti
il callback di JavaScript.- Particolarità: questo non è zucchero sintattico solo (anche se è dolce). In questo modo, tutti gli argomenti sono serializzati o deserializzati come necessari. Per esempio, è sicuro di tornare
NSData*
più parti, ma non comeArray
/Dictionary
.
- Particolarità: questo non è zucchero sintattico solo (anche se è dolce). In questo modo, tutti gli argomenti sono serializzati o deserializzati come necessari. Per esempio, è sicuro di tornare
IOS Echo Plugin Plugin
Aggiungiamo i seguenti al progetto config.xml
file:
<feature name="Echo">
<param name="ios-package" value="Echo" />
</feature>
Poi aggiungiamo i seguenti file ( Echo.h
e Echo.m
) nella directory Plugins all'interno della nostra directory di applicazione Cordova-iOS:
/********* Echo.h Cordova Plugin Header *******/
#import <Cordova/CDV.h>
@interface Echo : CDVPlugin
- (void)echo:(CDVInvokedUrlCommand*)command;
@end
/********* Echo.m Cordova Plugin Implementation *******/
#import "Echo.h"
#import <Cordova/CDV.h>
@implementation Echo
- (void)echo:(CDVInvokedUrlCommand*)command
{
CDVPluginResult* pluginResult = nil;
NSString* echo = [command.arguments objectAtIndex:0];
if (echo != nil && [echo length] > 0) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end
Diamo un'occhiata al codice. In cima abbiamo tutte le necessarie importazioni di Cordova. La nostra classe si estende da CDVPlugin
(molto importante).
Questo plugin supporta solo un'azione, la echo
azione. In primo luogo, si afferra l'eco stringa utilizzando il objectAtIndex
metodo sul nostro args
, dicendo che vogliamo ottenere il parametro 0A nella matrice di argomenti. Facciamo un po' di controllo parametro: assicurarsi che non è nil
e assicurarsi che non è una stringa di lunghezza zero.
Se si, torniamo un PluginResult
con un ERROR
stato. Se tutti quei controlli passano, poi torniamo un PluginResult
con un OK
lo status e passare il echo
abbiamo ricevuto in primo luogo come un parametro di stringa.
Infine, inviamo il risultato di self.commandDelegate
, che esegue il exec
callback del metodo di successo o fallimento sul lato JavaScript. Se viene chiamato il callback di successo, passa il echo
parametro.
Filettatura
Plugin metodi vengono eseguiti nello stesso thread come interfaccia utente. Se il tuo plugin richiede una grande quantità di elaborazione o richiede una chiamata di blocco, è necessario utilizzare un thread in background. Ad esempio:
- (void)myPluginMethod:(CDVInvokedUrlCommand*)command
{
// Check command.arguments here.
[self.commandDelegate runInBackground:^{
NSString* payload = nil;
// Some blocking logic...
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:payload];
// The sendPluginResult method is thread-safe.
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}];
}
Funzionalità avanzate del Plugin
Vedere altri metodi che è possibile eseguire l'override in:
Ad esempio, si può collegare nella pause
, resume
, app terminare e handleOpenURL
eventi.
Plugin debug
Per eseguire il debug lato Objective-C, si utilizzerebbe il debugger integrato di Xcode. Per JavaScript, su iOS 5,0 è possibile utilizzare Weinre, un progetto di Cordova Apache o iWebInspector, un'utilità di terze parti
Per iOS 6, usereste 6.0 Safari semplicemente allegare all'app in esecuzione nel iOS 6 simulatore.
Trabocchetti comuni
Non dimenticare di aggiungere il mapping del vostro plugin config. Xml. Se si dimentica, viene registrato un errore nella console di Xcode.
Non dimenticate di aggiungere qualsiasi host che si connette a nella lista bianca, come descritto nella guida di dominio Whitelist. Se si dimentica, viene registrato un errore nella console di Xcode.