为什么Cordova 2.7.0 JS看起来不再适用于远程页面?

背景

我试图将一个基于Cordova 2.0的iOS应用升级到2.7版。

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

Cordova 2.7有一个名为InAppBrowser的function,我希望可以使用而不是ChildBrowser。 InAppBrowser除了缺less一个在Safari中打开的button外,基本上也是一样的。

问题

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

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

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

为了testing这个embedded式起始页面,我把这行放在config.xml

 <content src="index.html" /> 

当我运行应用程序,我马上得到“准备好!” 警报。

要testing这个作为远程起始页(我打算链接到最终应用程序的远程页面,我只是用它作为testing的起始页面,结果是一样的,如果我从embedded式页面链接。 ,我把这一行放在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秒钟之后deviceready没有被触发”。 所以这告诉我cordovaJS是不正确的开始。 不用说,我不能让InAppBrowser在远程站点的子浏览器中启动链接,但是我可以在embedded式起始页面上正常工作。

任何人有任何想法去哪里从这里? 这是一个相当简单的例子,所以我假设这是一个Cordova设置问题或function的变化。 我感谢任何想法,谢谢!

是的,2.7的东西爆发了 – 与我们的cordova-cli工作有关。 请参阅: https : //issues.apache.org/jira/browse/CB-3029

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

我有一个类似的问题,升级到cordova2.7。 然而,我的问题是我所有的console.logs在运行应用程序时停止触发。 我无法弄清楚为什么我这一生正在发生。 我以为是因为我升级了jquery.mobile。 那不是。 然后我认为这是一个.htaccess的问题,那也不是。 事实certificate,这是造成这个问题的cordova2.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(); */ 

通过调用以下函数来replace整个块:

 finishPluginLoading(); 

我的日志现在正在工作。 只花了我3天的时间挠挠我的脑袋。

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

如果将Cordovaembedded到外部网页中,将无法从混合应用程序中打开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的function来注入“桥”代码来解决这个问题)。

Shazron提到这个问题是文件“cordova_plugins.json”的问题。

为了解决不改变代码的问题,可以在根文件夹中创build“cordova_plugins.json”文件,并在该文件中的引号之间插入一个内容。 我的例子有以下内容:

 "Just a dummy file required since Cordova 2.6.0" 

创build一个包含{}的文件cordova_plugins.json 。 然后去cordova-2.7.0.js并注释这一行require('cordova/channel').onNativeReady.fire(); 那么当开发完成时,将其添加回来

像我一样,如果您正在使用Cordova 5.1.1并且想要在redirect之后访问本地function,那么复制\ platform \ platform_name \ assets \ www \中的cordova.js,cordova_plugins.js和plugins文件夹,并将它们放在服务器上,最后参考cordova.js在你的html里面。 每个插件添加后,请确保更新这些文件和文件夹。