【问题标题】:Why does Cordova 2.7.0 JS seemingly no longer work on remote pages?为什么 Cordova 2.7.0 JS 似乎不再适用于远程页面?
【发布时间】:2013-04-25 02:25:40
【问题描述】:

背景

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

它基本上是一个指向远程搜索引擎的欢迎屏幕(请不要让 cmets 关于应用程序的有效性和可能的​​批准,因为我们已经过去了),我们使用 ChildBrowser 插件来启用在子目录中打开链接浏览器,以免将用户困在 Cordova webview 中。

Cordova 2.7 有一个名为InAppBrowser 的功能,我希望用它来代替 ChildBrowser。 InAppBrowser 基本上做同样的事情,除了缺少一个在 Safari 中打开的按钮。

问题

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

从远程网页加载 Cordova JS 时,我的测试 Cordova 2.7 应用似乎无法正确加载。

我尝试在嵌入式起始页和远程起始页上使用完全相同的 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" />

当我运行应用程序时,我会立即得到“Ready!”警告。

将此作为远程起始页进行测试(我的目标是链接到最终应用程序中的远程页面,我只是将其用作测试的起始页。结果是如果我从嵌入式页面链接,则相同。),我把这一行放在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 秒后,我收到警报“设备就绪在 5 秒后未触发​​。”。所以这告诉我 Cordova JS 没有正确启动。不用说,我无法让 InAppBrowser 在远程站点的子浏览器中启动链接,但我可以让它在嵌入的起始页上正常工作。

有人知道从这里去哪里吗?这是一个非常简单的示例,因此我假设这是 Cordova 设置问题或功能更改。感谢您的任何想法,谢谢!

【问题讨论】:

  • 我刚刚用 Cordova 2.6 进行了测试,这个 2.6 的精确设置工作正常。 Cordova JS 在远程页面上工作。所以在 2.7 中改变了一些东西来打破这个。
  • 这似乎与之前的版本有关,所以有点奇怪:issues.apache.org/jira/browse/CB-3029

标签: javascript ios cordova


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我在升级到 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 天的时间挠头。

    希望这可以帮助遇到类似问题的人。

    【讨论】:

    • 其实我说得太早了。这并没有纠正我的 console.log 问题。知道为什么 2.7 会破坏 Chrome 中的 console.log 输出吗?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      "Just a dummy file required since Cordova 2.6.0"
      

      【讨论】:

      • 我尝试了上述所有支持来解决同样的问题,但没有希望。我尝试添加空的cordova_plugins.json,尝试将cordova-2.7.0.js的引用链接到本地主机 10.2.0.108:8000/mobile/cordova-2.7.0.js,也尝试了评论选项。
      【解决方案5】:

      是的,2.7 中出现了问题 - 与我们的 cordova-cli 工作有关。见:https://issues.apache.org/jira/browse/CB-3029

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

      【讨论】:

      • 谢谢,我用 call 替换了代码块,对我来说效果很好!非常感谢!
      • 添加 cordova_plugins.json 对我不起作用。我还注释掉了 cordova.js 中的部分(根据您的链接)并且有效。
      • 这消除了脚本正在寻找 cordova_plugins.json 的错误,但我仍然收到“设备就绪在 5 秒后没有触发。”
      • 我也是,我正在使用 Riddle Chrome 扩展程序。
      • 我尝试了上述所有支持来解决同样的问题,但没有希望。我尝试添加空的cordova_plugins.json,尝试将cordova-2.7.0.js的引用链接到本地​​主机10.2.0.108:8000/mobile/cordova-2.7.0.js,也试过评论选项。
      【解决方案6】:

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

      【讨论】:

      • 这听起来不对。当 Cordova JS 在 2.0 版的远程网页上正常加载并且 Cordova 插件 ChildBrowser 也可以正常工作时,为什么现在会出现问题?
      • 此外,我只是用 2.6 而不是 2.7 进行了测试,它可以按我的意愿工作。显然,2.7 出现了问题。
      猜你喜欢
      • 2011-02-03
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 2019-10-23
      相关资源
      最近更新 更多