【问题标题】:Inject code in inApp browser and get it's return value in the app在inApp浏览器中注入代码并在应用程序中获取它的返回值
【发布时间】:2013-05-07 05:30:42
【问题描述】:

我正在编写一个 phonegap 应用程序,它在 inAppBrowser 中启动一个 Web 应用程序。 我想从这个网络应用中获得某些反馈,以便在我的 phonegap 应用中进一步使用它。

因此,用户启动网络应用程序,在其中执行一些操作,然后单击按钮,网络应用程序将一个值返回给 phonegap 应用程序。

我想我可以使用 inAppBrowser 的 executeScript 方法来注入一个函数,该函数将在 Web 应用程序中使用某个事件被调用,并且当该函数被调用时,在 Web 应用程序中评估它的返回值。 我发现的只是phonegap的不完整文档和stackoverflow上的这个问题: Augmenting a webapp with native capabilities - Bridging PhoneGap's InAppBrowser with Rails web app application javascript

遗憾的是它并没有像我预期的那样工作,因为回调函数会立即触发,而无需等待注入的函数执行。

这是我的移动应用代码

<!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>

她是我的网络应用代码

<!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>

【问题讨论】:

  • 我也无法让 iabRef.executeScript 返回值。我从来没有进入回调函数。这在 IOS 上运行良好,但在 android 上不行。我能够浏览android中的调试代码,看起来还不错。你能让这个工作吗?
  • 我完全放弃了 Cordova,选择在 webviews 和应用程序之间编写自己的界面。
  • 升级到 phonegap 3.1 为我解决了这个问题。我的目标是 android kitkat,这破坏了 phonegap 3.0 中的东西。
  • 仅供参考,IAB 的最新 ionic cordova 插件不再采用回调方法,而是返回一个 Promise

标签: javascript cordova phonegap-plugins


【解决方案1】:

code 字符串值中,定义一个函数并调用它。返回值将在回调的参数中返回(或在 ngCordova 中作为 promise 的已解析参数)。感谢@Jonathan Adami 的建议。

【讨论】:

    【解决方案2】:

    看看这个,它可能是你正在寻找的东西here

    【讨论】:

      【解决方案3】:

      只是一个疯狂的猜测,但你没有执行这个函数......

      {code: "var evaluateFeedback = function(){return 'Done';};evaluateFeedback();"}

      或更好: {code: "'完成';"}

      【讨论】:

        【解决方案4】:
                        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){
        
                        });
        

        用于在应用程序中取回返回值的事件

        【讨论】:

        • 我知道这些。问题是,我能听到的唯一事件是 loadstart、loadstop、loaderror 和 exit。是否无法对 inAppBrowser 中的其他事件做出反应?
        猜你喜欢
        • 2017-09-08
        • 1970-01-01
        • 2018-12-17
        • 2011-07-25
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多