31

我想不出一个很好的解释,但是当我包括

<script type="text/javascript" src="phonegap.js"></script>

在我尚未修改的 Phonegap 应用程序中,屏幕上会出现 2 个弹出窗口。

//The first popup
gap:["PluginManager","startup","PluginManager224542697"]

//the second
gap:["App","show","App224542698"]

我必须取消这两个弹出窗口,并且真的很想了解其中的原因。

有问题的两行在 phonegap.js 的第 21117 和 21118 行

 // Tell the native code that a page change has occurred.
 require('cordova/exec')(null, null, 'PluginManager', 'startup', []);
 require('cordova/channel').onNativeReady.fire();

当它在应用程序中时,这当然不会中断,但这确实意味着开发几乎是不可能的。

4

7 回答 7

8

对我来说,这个问题正在发生,因为 phonegap.js 在 phonegap 之外运行时会退回到基于 PROMPT 的模式。我相信这种模式适用于 Android 3.2 以下的 phonegap,所有通信都是通过警报提示(这就是你所看到的)。

我通过在加载 phonegap.js 之前设置以下变量来解决问题:

window._cordovaNative = true;

这会欺骗 phonegap 认为您在 phonegap 3.2 以上运行,因此永远不会进入提示模式。

当然,如果您的目标设备低于 3.2,那么这样做可能会破坏这些设备上与 Phonegap 的所有通信......

于 2014-02-04T03:09:45.687 回答
6

在尝试以下操作时,我偶然发现了这个错误和问题:

  • cordova create用等完成了 hello world 教程。
  • 部署在模拟器和连接的设备上,没有 oa 问题。
  • 我在做时遇到了与 OP 相同的错误cordova serve,只是按照指示导航到 //localhost:8000。

我同意 - 看到这些警报非常烦人。它扼杀了基于 js 的快速开发的全部意义。

出了什么问题?

与“设备”的通信 API 正在回退到此处理程序 promptbasednativeapi.js(另请参见cordova-js/src/android/exec.js)。在版本 3.xx 上只是说

window._cordovaNative = true;

对我来说还不够。应该实现整个通信协议。

快速解决方案

您可以使用一些浏览器端的“模拟器”,例如chrome 的Ripple 模拟器扩展( [更新]考虑使用https://github.com/apache/incubator-ripple为 duKes0mE 指出的 phonegap 3.xx)。这样的“模拟器”可以理解并触发相应的事件,例如“设备就绪”。到目前为止,它看起来很有希望:-)

到底是怎么回事?

@antscode 的回答很有帮助。在对cordova/cordova-js代码进行了一些挖掘和阅读之后,我发现

  • 错误来自 Cordova 插件架构的一部分机制。插件被开发为可以从 js 执行的所谓的cordova命令——这正是cordova架构的组织方式。
  • Cordova 是一个 JS 框架。一是建议主要编写(非本地)JS 代码。要与所有这些不同的原生插件通信,必须提出与它们通信的协议,一种带有 JSON 序列化的 RPC。这正是要拥有的东西。
  • 插件也可以是纯 JS。引用手册

使用以下命令创建一个新的echome插件:

window.echo = function(str, callback) {
    cordova.exec(callback, function(err) {
        callback('Nothing to echo.');
    }, "Echo", "echo", [str]);
};

通过 JS 作为cordova 命令访问它:

 window.echo("echome", function(echoValue) {
        alert(echoValue == "echome"); // should alert true.
    });

没有模拟器解决方案

我可以想象这样一种情况,一个相当复杂的应用程序将在这样的网络浏览器客户端“模拟器”(并且仅在其中)内部中断。更好的解决方案是找到一种方法来说服应用程序不要回退到 PROMPT 通信方法(发出烦人警报的方法)。好吧,我现在没有这样的解决方案 :-( 不过很乐意学习如何去做。

解决方案在这里:https ://gist.github.com/ewiger/7d5e0cc8fccf311e9ce2

于 2014-07-26T18:38:10.297 回答
1

取消按钮可能没有返回事件。如果没有指令传递给内核,这会导致异常(您的浏览器崩溃)。尝试为取消按钮定义一个操作,看看是否有帮助。

于 2013-10-04T06:14:52.910 回答
1

我进入 hello/platforms/ios/CordovaLib 并将 cordova.js 文件复制到我的 www 根目录并更改

或者从这里下载:https ://github.com/apache/cordova-ios/blob/master/CordovaLib/cordova.js

<script type="text/javascript" src="phonegap.js"></script>

<script type="text/javascript" src="cordova.js"></script>

并且没有更多的弹出窗口

于 2013-10-10T13:21:45.400 回答
0

我在另一个开发人员创建的项目中遇到了同样的问题。就我而言,原因是 Cordova/PhoneGap 2.x 配置的剩余部分。此弹出窗口与插件系统有关。从我的 config.xml 中删除插件使它变得更好:

<plugin name="InAppBrowser" value="org.apache.cordova.InAppBrowser" />

最后,我决定最好创建一个新的 3.x 项目并将我所有的 HTML/CSS/JS 移动到新创建的项目中。新项目解决了所有问题。

于 2013-12-27T00:03:04.430 回答
0

我最初拒绝就这个问题发表答案。正如其中一位开发人员所提到的,phonegap.js除非是生产代码,否则不应包含。

然而,这意味着您无法测试 phonegap 功能。

简单解释一下我的思考过程,在我开发 (php) 的这些年里,我经常设置全局变量,我可以轻松地为dev, stage or production.

请考虑这可能不是最好的方法,但对我来说它是有效的,我很享受我的主干应用程序的其余部分,而不是目前重新访问它;)

所以,我这样做了:

//Define SD
var SD = {}; //define SD so we can use it globally

/*==================================================
Is Mobile - If true then we are a mobile
================================================== */
SD.isMobile = true;

//This is with the assumtion that your domain contains (for exmaple) http://yourdomain.local
if (document.URL.indexOf("local") > 0 || document.URL.indexOf("sex") > 0) {
    SD.isMobile = false;
}

SD = {
    isMobile: SD.isMobile,
    ENVIROMENT: 'liveApp',
    CDN: 'yoururl.com/',
    HTTP: 'http://yoururl.com/',
 }

// #define the globals depending on where we are -----------------------------------------------------
SD.globals = function () {
    switch (window.location.hostname) {
        case "sd.local":
            SD.ENVIROMENT = 'localApp',
                SD.CDN = 'sd.local/',
                SD.HTTP = 'http://yoururl.com/',
                SD.AJAX = SD.HTTP+'app/';
            break;
        case "192.168.0.25": //Set to your machines IP address
            SD.ENVIROMENT = 'mobilePhone',
                SD.AJAX = SD.HTTP+ 'app/';
            break;
        default:
            SD.AJAX = SD.HTTP+'app/';
            break;
    }
};

现在最后,在完成所有工作后,如果需要,init我会添加。phonegap.js

 if(SD.isMobile){
    $.getScript('phonegap.js', function( data, textStatus, jqxhr){
    c( "cordova was loaded." );
});
于 2014-02-05T16:02:37.867 回答
-1

我遇到了与您描述的完全相同的两个弹出窗口,但仅在我将 iOS 添加到我的 phonegap 项目时才遇到它们。我第一次这样做时,我从我的工作 Android 应用程序中复制了 www 文件夹。这是问题所在,因为它有来自 Android 插件的工件。在使用命令行工具在 phonegap 项目中爆破和重新创建 iOS 应用程序之后,我更加小心地只为我的应用程序带来了解决问题的所需的 html、js 和 css 文件。

于 2013-09-09T05:48:58.727 回答