2013-05-13 6 views
15

Ich schreibe eine Phonegap-App, die eine Web-App in einem InAppBrowser startet. Ich möchte bestimmte Rückmeldungen von dieser Web-App erhalten, um sie in meiner phonegap-App weiter zu verwenden.Code in InApp-Browser injizieren und den Rückgabewert in der App erhalten

So der Benutzer startet die Web-App, tut einige Dinge dort und nach einem Klick auf eine Schaltfläche, gibt die Web-App einen Wert an die Phonegap-App zurück.

Ich dachte, ich könnte die executeScript-Methode des inAppBrowser verwenden, um eine Funktion zu injizieren, die innerhalb der Web-App mit einem Ereignis aufgerufen wird, und wenn diese Funktion aufgerufen wird, ihren Rückgabewert in der Web-App auswerten. Alle ich fand, war das nicht sehr vollständige Dokumentation phonegap und diese Frage auf Stackoverflow: Augmenting a webapp with native capabilities - Bridging PhoneGap's InAppBrowser with Rails web app application javascript

Leider funktioniert es nicht, wie ich erwartet hatte, weil die Callback-Funktion Brände imediately, ohne für die injizierten Funktion wartet auszuführen.

Hier ist mein mobiler app Code

<!DOCTYPE html> 
<html> 
    <head> 
    <title>InAppBrowser.executeScript Example</title> 

    <script type="text/javascript" charset="utf-8" src="cordova-2.7.0.js"></script> 
    <script type="text/javascript" charset="utf-8"> 

    // Wait for Cordova to load 
    // 
    document.addEventListener("deviceready", onDeviceReady, false); 

    // Global InAppBrowser reference 
    var iabRef = null; 

    // Inject our custom JavaScript into the InAppBrowser window 
    // 
    function addFeebackFunction() { 
     iabRef.executeScript(
      {code: "var evaluateFeedback = function(){return 'Done';};"}, 
      function(data) { 
       alert(data); 
      } 
     ); 
     //iabRef.close(); 
    } 

    function iabClose(event) { 
     iabRef.removeEventListener('loadstop', addFeebackFunction); 
     iabRef.removeEventListener('exit', iabClose); 
    } 

    // Cordova is ready 
    // 
    function onDeviceReady() { 
     iabRef = window.open('http://{ipaddress}/test/', '_blank', 'location=no'); 
     iabRef.addEventListener('loadstop', addFeebackFunction); 
     iabRef.addEventListener('exit', iabClose); 
    } 

    </script> 
    </head> 
    <body> 
     <h1>Mobile App</h1> 
    </body> 
</html> 

Und sie ist mein Web-App-Code

<!DOCTYPE HTML> 
<html> 
<head> 
    <title> 
     Test 
    </title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 

    <script type="text/javascript" src="./js/jquery-1.8.3.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
      $('#get-feedback').click(function() { 
       var feedback = $('#feedback').val(); 
       evaluateFeedback(feedback); 
      }); 
     }); 
    </script> 
</head> 
<body> 
<div data-role="page"> 
    <article data-role="content"> 
     <h1>Web app</h1> 
     <input type="text" id="feedback" /><br /> 
     <button type="button" id="get-feedback">Feedback</button> 
    </article> 
</div> 
</body> 
</html> 
+0

Ich konnte auch iabRef.executeScript nicht erhalten, um einen Wert zurückzugeben. Ich komme nie in die Callback-Funktion. Dies funktioniert gut in iOS, aber nicht auf Android. Ich war in der Lage, durch den Debug-Code in Android zu gehen und es sah in Ordnung. Konnten Sie das zur Arbeit bringen? – TWilly

+0

Ich gab Cordova komplett auf und entschied mich, meine eigene Schnittstelle zwischen den Webviews und der App zu schreiben. – Oliver

+0

Das Upgrade auf phonegap 3.1 hat das Problem für mich gelöst. Ich zielte auf android kitkat, und das brachte Dinge in phonegap 3.0 kaputt. – TWilly

Antwort

0
   ref.addEventListener('loadstart', function(event){ 
        //alert('start: ' + event.url); 
       }); 
       ref.addEventListener('loadstop', function(event){ 
        //alert('stop: ' + event.url); 
       }); 
       ref.addEventListener('loaderror', function(event){ 
        //alert('error: ' + event.message); 
       }); 
       ref.addEventListener('exit', function(event){ 

       }); 

Verwenden oben für Veranstaltungen für Rückgabewert zurück in der Anwendung unter

+3

Ich kenne diese. Das Problem ist, dass die einzigen Ereignisse, die ich hören kann, Loadstart, Loadstop, Loaderror und Exit sind. Gibt es keine Möglichkeit auf andere Ereignisse im inAppBrowser zu reagieren? – Oliver

2

Nur eine wilde Vermutung, aber Sie führen diese Funktion nicht aus ...

{Code: "var evaluateFeedback = function() {return 'Fertig';}; evaluateFeedback();"}

oder besser: {Code: " 'Fertig',"}

1

Scheck Dies könnte etwas sein, das Sie suchen. here

0

Definieren Sie im Stringwert code eine Funktion und rufen Sie sie auf. Der Rückgabewert wird im Argument des Callbacks (oder in ngCordova als aufgelöstes Argument des Versprechens) zurückgegeben. Danke @ Jonathan Adami für den Vorschlag.

Verwandte Themen