2012-07-25 1 views
7

Ho alcuni valori generati dal mio codice nativo che vorrei passare a PhoneGap. Questi dati sono generati in tempo reale e non sono direttamente influenzati dalle azioni dell'utente attraverso il gui di PhoneGap. Il mio codice nativo è parte di un plugin che ho creato.passaggio valore da codice nativo iOS a cordova

Qual è il modo migliore per avvicinarsi a questo? Voglio avere una funzione per inviare i dati in qualsiasi momento e avere un ascoltatore sul lato cordova. Sto usando Cordova 1.5 con Xcode 4.3.

Ecco quello che ho finora:

swipe.js:

var swipe={ 
    callNativeFunction: function (success, fail, resultType) { 
    return Cordova.exec(success, fail, 
         "ca.swipe", 
         "nativeFunction", 
         [resultType]); } 

}; 

index.html:

... 

function callNativePlugin(returnSuccess) { 
      swipe.callNativeFunction(nativePluginResultHandler, nativePluginErrorHandler, returnSuccess); 
     } 

     function nativePluginResultHandler (result) { 
      alert("SUCCESS: \r\n"+result); 
     } 

     function nativePluginErrorHandler (error) { 
      alert("ERROR: \r\n"+error); 
     } ... <body onload="onBodyLoad()">  <h1>Hey, it's Cordova!</h1> 

     <button onclick="callNativePlugin('success');">Success</button> 
     <button onclick="callNativePlugin('error');">Fail</button> 

    </body> ... 

swipe.h:

... 
@interface swipe : CDVPlugin 
- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; 
@end 

magnetiche .m:

... 
- (void) nativeFunction:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { 

    NSLog(@"Hello, this is a native function called from PhoneGap/Cordova!"); 

    //get the callback id 
    NSString *callbackId = [arguments pop]; 
    NSString *resultType = [arguments objectAtIndex:0];  
    NSMutableArray *GlobalArg=arguments; 

    CDVPluginResult *result; 
    if ([resultType isEqualToString:@"success"]) { 
     result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString: @"Success :)"]; 
     //writes back the smiley face to phone gap. 
     [self writeJavascript:[result toSuccessCallbackString:callbackId]]; 
    } 

... 

Il codice che ho adesso non ha nulla per fare ciò che voglio. Non sono sicuro di come impostare il codice sia in cordova che in nativo.

+0

L'approccio che descrivi sembra un modo molto ragionevole per farlo, è l'unica domanda o hai difficoltà a farlo funzionare? – Brian

+0

@rhooligan Ho difficoltà a farlo funzionare, non ho molta familiarità con Objective-C e la sua interazione con PhoneGap. Sarebbe bello avere un esempio di qualche tipo. Grazie! – mugetsu

+0

Puoi pubblicare il tuo codice Objective-C e poi mostrarci il tuo codice Cordova? Ho scritto alcuni plug-in quando era ancora chiamato PhoneGap e ci sono alcune cose specifiche che dovevi fare nel bundle e una sequenza di init che dovevi chiamare da JS. Tuttavia, il sistema potrebbe aver subito alcune modifiche da allora. – Brian

risposta

2

Suona come è necessario essere in grado di parlare di nuovo verso il basso per PhoneGap da Objective C, nel qual caso si dovrebbe essere in grado di usare qualcosa come:

NSString *jsResult = [theWebView stringByEvaluatingJavaScriptFromString:@"hello()"]; 
NSLog(@"jsResult=%@",jsResult); 

E se si dispone di una funzione di JS come "ciao "nel vostro index.html come questo:

function hello(){return "hello";} 

E 'un modo di parlare di nuovo al vostro livello di web PhoneGap

1

creare una classe di tipo CDVPlugin

importazione #import in quella classe

inizializzare un metodo di gestore .h classe

- (void)Device:(CDVInvokedUrlCommand *)command; 

e implementare il metodo della classe .m

- (void)openDevice:(CDVInvokedUrlCommand *)command{ 
    CDVPluginResult *pluginResult = nil; 
    BOOL checkOpenDevice=NO; 
    pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:checkOpenDevice]; 
     [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; 
    } 
} 

in questo modo attraverso self.commandDelegate i tuoi dati saranno in grado di raggiungere la classe cordova se il .js fi le hit (chiama) quel particolare metodo che è inizializzato nella classe .h.