Trigger obiettivo C metodo javascript utilizzando JavaScriptCore in iOS 7 in ViewControllers

Sto caricando un url in una webview che ha seguito HTML e javascript chiamata di funzione. Ora sto cercando in quando l’utente tocca il pulsante di invio nella webview dovrebbe chiamare qualsiasi metodo nel viewController. Webview dovrebbe caricare l’url(webview delegato) è un approccio, ma è un nuovo modo per conoscere quando la funzione javascript viene chiamato da webview dovrebbe informare viewcontroller o innescare qualsiasi metodo view controller.

Non sto cercando per questa soluzione, in questo abbiamo bisogno di

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

    NSLog(@"passed data from web view : %@",[[request URL] query]);

    if([[[request URL] query] isEqualToString:@"clickedOnLineNo"])
    {
//Do your action here

    }

Dobbiamo passare per un falso URL dal tuo metodo di javascript come,

window.location = "someLink://yourApp/form_Submitted:param1:param2:param3";  

il clic su un pulsante o la tua azione richiesta.

Ma c’è qualche nuova possibilità di JavaScriptCore per ottenere lo stesso.

  • ecco la pagina HTML di esempio che io sono il carico <!DOCTYPE html> <html> <head> <script type=”text/javascript”> <!– documento.write(“<h1></h1>”); function submitButton( ) { //Questa funzione deve essere chiamata in Objective C classe quando l’utente tocca il pulsante webview } //–> </script> </head> <body> <h1>il Mio Mobile App</h1> <p>Si prega di inserire i Dettagli</p> <form name=”feedback” method=”post” action=”mailto:[email protected]”> <!– Gli elementi del modulo, sarà andare qui –> </form> <form name=”inputform”> <input type=”button” onClick=”submitButton()” value=”invia”> </form> </body> </html>
  • è possibile creare un applicazione phonegap, che app è possibile telefonare al luogo di webview. eseguirà la stessa d’altronde si desidera
  • Grazie Rahul, ma non c’è nessuna possibilità da JavaScriptCore cornice di lavoro che di recente Apple ha introdotto in iOS 7.
  • possibile duplicato di Chiamare un Obiettivo-C funzione JavaScript ospitato su qualche pagina web
  • Grazie Dark ma il link che ha lo stesso approccio di chiamare un falso url di visualizzazione web
  • Quindi, cosa c’è di sbagliato con questo approccio? Sembra che questo è l’unico approccio. Vedi anche Come chiamare Objective-C da Javascript? e domande simili (a meno che mi manca qualcosa, la ricerca di accensione e un sacco di domande simili alla tua, tutti con le stesse risposte).

InformationsquelleAutor user3283486 | 2014-02-07



One Reply
  1. 21

    Objective-C, interfaccia JavascriptCore introdotta con iOS 7 consente di chiamare Objective-C metodi da Javascript. Per una grande introduzione a queste caratteristiche, check out il WWDC 2013 introduzione “l’Integrazione di JavaScript in Applicazioni Native” sessione di Apple developer network: https://developer.apple.com/videos/wwdc/2013/?id=615

    Ha un breve tratto verso la fine del WebView (MacOs non solo iOS)

    L’esempio di codice riportato di seguito viene illustrato come implementare ciò che si desidera per iOS.

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,40,320,320)];
        webView.delegate = self;
        [self.view addSubview:webView];
         NSString *pageSource = @"<!DOCTYPE html> <html> <head> </head> <body> <h1>My Mobile App</h1> <p>Please enter the Details</p> <form name=\"feedback\" method=\"post\" action=\"mailto:[email protected]\"> <!-- Form elements will go in here --> </form> <form name=\"inputform\"> <input type=\"button\" onClick=\"submitButton('My Test Parameter')\" value=\"submit\"> </form> </body> </html>";
        [webView loadHTMLString:pageSource baseURL:nil];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        JSContext *context =  [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; //Undocumented access
        context[@"submitButton"] = ^(NSString *param1) {
            [self yourObjectiveCMethod:param1];
        };
    }
    
    - (void)yourObjectiveCMethod:(NSString *)param1 {
        NSLog(@"User clicked submit. param1=%@", param1);
    }

    Cose da notare:

    • Accesso JSContext di una UIWebView è documentata. Due tecniche sono conosciute (vedi Accedere al JavaScriptCore motore di una UIWebView). La prima tecnica è usata qui.
    • Non è necessario definire la funzione javascript “submitButton” all’interno della pagina, è possibile definire la funzione da Objective-C, utilizzando la webView è JSContext
    • Il caricamento di una pagina in una webview, provoca la sua JSContext per essere sostituito, quindi non si dovrebbe implementare un delegato per la UIWebView e definire il vostro Obiettivo-C richiamata nell’implementazione del selettore per -webViewDidFinishLoad:
    • Ho assunto che vogliono passare dei parametri a questo callback, così ho mostrato un esempio di parametro. Anche se questo non rientra nel video tutorial di cui sopra (o il PDF equivalente), guardando JSValue.h mostra che JavascriptCore offre built-in di conversione tra le seguenti Objective-C e Javascript tipi:

    .

      Objective-C type  |   JavaScript type
    --------------------+---------------------
            nil         |     undefined
           NSNull       |        null
          NSString      |       string
          NSNumber      |   number, boolean
        NSDictionary    |   Object object
          NSArray       |    Array object
           NSDate       |     Date object
          NSBlock *     |   Function object *
             id **      |   Wrapper object **
           Class ***    | Constructor object ***
    
    * Instances of NSBlock with supported arguments types will be presented to
    JavaScript as a callable Function object. For more information on supported
    argument types see JSExport.h. If a JavaScript Function originating from an
    Objective-C block is converted back to an Objective-C object the block will
    be returned. All other JavaScript functions will be converted in the same
    manner as a JavaScript object of type Object.
    
    ** For Objective-C instances that do not derive from the set of types listed
    above, a wrapper object to provide a retaining handle to the Objective-C
    instance from JavaScript. For more information on these wrapper objects, see
    JSExport.h. When a JavaScript wrapper object is converted back to Objective-C
    the Objective-C instance being retained by the wrapper is returned.
    
    *** For Objective-C Class objects a constructor object containing exported
    class methods will be returned. See JSExport.h for more information on
    constructor objects.
    • Contesto JS funziona in modo simile, in qualche modo, come [webView stringByEvaluatingJavaScriptFromstring:@”documento.getElementById(‘cognome’).valore;”]; ma offre di più. Grazie Mike per la spiegazione.
    • È questa la soluzione App Store al sicuro???
    • Apple non ha formalmente documentata l’Obiettivo-C estensioni hanno aggiunto al JavaScriptCore quadro quando iOS7 è stato rilasciato, così il vostro chilometraggio può variare per una delle 2 tecniche conosciute. Non ho presentato un’app, utilizzando sia la tecnica, tuttavia ci sono state segnalazioni sul MODO di successo contributi, utilizzando la tecnica di prima (come nell’esempio sopra). Vedere mprudhom la risposta di stackoverflow.com/questions/18920536/…

Lascia un commento