为什么Cordova 2.7.0 JS似乎不再适用于远程页面?

时间:2013-05-01 03:12:54

标签: javascript ios cordova

背景

我正在尝试将基于Cordova 2.0构建的iOS应用升级到2.7版。

它基本上是一个指向远程搜索引擎的欢迎屏幕(请保留关于应用有效性和可能的​​批准的评论,因为我们已经过去了),我们使用ChildBrowser插件启用了打开链接子浏览器,以免将用户陷入Cordova webview。

Cordova 2.7有一个名为InAppBrowser的功能我希望使用而不是ChildBrowser。除了缺少在Safari中打开的按钮外,InAppBrowser的功能基本相同。

问题

现有应用程序的远程网页包括Cordova JS(以及ChildBrowser插件的网页),它可以在子浏览器中打开链接。

我的测试Cordova 2.7应用程序在从远程网页加载时似乎没有正确加载Cordova JS。

我尝试在嵌入式启动页面和远程启动页面上使用完全相同的HTML:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script>
  </head>
  <body>
    <script>
      document.addEventListener("deviceready", onDeviceReady, false);
      function onDeviceReady() {
        alert("Ready!!");
      }
    </script>
  </body>
</html>

要将此测试作为嵌入式起始页,我将此行放在config.xml

<content src="index.html" />

当我运行应用程序时,我立即得到“准备就绪!”警报。

要将此测试作为远程启动页面(我的目标是链接到最终应用程序中的远程页面,我只是将其用作测试的起始页面。结果是如果我从嵌入页面链接,则相同。),我将此行放在config.xml

<content src="http://mydomain.com/mobile/index.php" />

当我运行应用程序时,我只是得到空白屏幕而没有警报。

此外,在cordova-2.7.0.js L. 6255,我改变了

console.log('deviceready has not fired after 5 seconds.');

alert('deviceready has not fired after 5 seconds.');

通过该更改,使用远程启动页面运行应用程序会导致空白页面,然后在五秒钟后,我收到警报“设备已经在5秒后未启动”。所以这告诉我Cordova JS没有正确启动。毋庸置疑,我无法让InAppBrowser在远程站点的子浏览器中启动链接,但我可以在嵌入式启动页面上正常工作。

任何人都有任何关于从何而去的想法?这是一个非常简单的例子,所以我假设这是Cordova设置问题或功能的变化。我很感激任何想法,谢谢!

6 个答案:

答案 0 :(得分:10)

是的,2.7中的某些内容与我们的cordova-cli工作有关。请参阅:https://issues.apache.org/jira/browse/CB-3029

修复方法是在根文件夹中添加一个名为“cordova_plugins.json”的空文件。

答案 1 :(得分:3)

我遇到了与升级到Cordova 2.7有关的类似问题。但是我的问题是我的所有console.logs在运行应用程序时停止了触发。我无法弄清楚为什么我的生活会发生这种情况。我以为是因为我升级了jquery.mobile。那不是它。然后我认为这是一个.htaccess问题,那也不是。事实证明,正是Cordova 2.7导致了这个问题。

我确实尝试在我的服务器上添加.json文件,但这并没有解决问题。

修复程序进入2.7源代码并注释掉以下代码:

/*comment out this as it is breaking console.logs
    var xhr = new context.XMLHttpRequest();
    xhr.onload = function() {
        // If the response is a JSON string which composes an array, call handlePluginsObject.
        // If the request fails, or the response is not a JSON array, just call finishPluginLoading.
        var obj = this.responseText && JSON.parse(this.responseText);
        if (obj && obj instanceof Array && obj.length > 0) {
            handlePluginsObject(obj);
        } else {
            finishPluginLoading();
        }
    };
    xhr.onerror = function() {
        finishPluginLoading();
    };
    xhr.open('GET', 'cordova_plugins.json', true); // Async
    xhr.send();
    */

通过调用以下函数替换整个块:

finishPluginLoading();

我的日志现在再次运行。我只花了3天时间挠头。

希望这有助于遇到类似问题的人。

答案 2 :(得分:0)

如果您将Cordova嵌入外部网页,则无法从您的混合应用程序中打开InAppBrowser,因此Cordova将无法加载。这是因为InAppBrowser要求Cordova完全加载并初始化,然后才能用于获取远程页面。您需要使用自己的HTML页面,<script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script>作为应用的主要入口点。然后,您可以使用InAppBrowser打开远程页面。 (您可以在onDeviceReady()中执行此操作,但不确定它是否会首先“闪存”页面。)我不认为远程页面中应该包含任何Cordova代码。由于同源策略,我不确定是否有可能甚至可以从远程页面与Cordova交互(可能你可以使用InAppBrowser的功能注入“桥接”代码来解决这个问题。)

答案 3 :(得分:0)

正如Shazron所说,问题是文件“cordova_plugins.json”的问题。

要解决不更改代码的问题,可以在根文件夹中创建“cordova_plugins.json”文件,并在此文件中的引号之间插入内容。 例如,我的内容如下:

"Just a dummy file required since Cordova 2.6.0"

答案 4 :(得分:0)

创建包含cordova_plugins.json的文件{}。然后转到cordova-2.7.0.js并对此行require('cordova/channel').onNativeReady.fire();发表评论,然后在完成开发后,将其添加回来

答案 5 :(得分:0)

如果您使用的是Cordova 5.1.1,并希望在重定向后访问本机功能,那么请复制位于\ platforms \ platform_name \ assets \ www \的cordova.js,cordova_plugins.js和plugins文件夹,并将它们放在服务器上,最后在你的html中引用cordova.js。每个插件添加后,请确保更新这些文件和文件夹。