10

背景

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

它基本上是一个指向远程搜索引擎的欢迎屏幕(请保留有关应用程序有效性和可能批准的评论,因为我们已经过去了),我们正在使用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" />

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

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

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

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

此外,在cordova-2.7.0.jsL. 6255 中,我更改了

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

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

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

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

4

6 回答 6

10

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

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

于 2013-05-02T16:12:31.537 回答
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 天的时间挠头。

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

于 2013-05-22T22:15:30.927 回答
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 的功能来注入“桥”代码来解决这个问题。)

于 2013-05-01T13:04:44.243 回答
0

创建一个cordova_plugins.json包含{}. 然后去cordova-2.7.0.js评论这一行require('cordova/channel').onNativeReady.fire();,然后在开发完成后,将其添加回来

于 2013-05-19T08:10:15.360 回答
0

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

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

"Just a dummy file required since Cordova 2.6.0"
于 2013-05-08T05:15:46.833 回答
0

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

于 2015-09-03T10:47:14.007 回答