Phonegap 3包含一个警告框,其中“OK”崩溃浏览器

时间:2013-09-04 20:39:33

标签: javascript android cordova

我无法为此提出一个很好的解释,但是当我加入

<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();

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

7 个答案:

答案 0 :(得分:7)

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

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

window._cordovaNative = true;

这样可以让你知道自己在电话号码3.2之上运行,因此永远不会进入提示模式。

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

答案 1 :(得分:5)

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

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

我同意 - 看到这些警报非常烦人。它杀死了快速非本地js开发的全部要点。

出了什么问题?

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

window._cordovaNative = true;

对我来说还不够。人们应该实施整个沟通协议。

快速解决方案

您可以使用某些浏览器端“模拟器”,例如{{3>}代表chrome( [更新] 考虑使用Ripple emulator extension为duKes0mE指出的phonegap 3.x.x。这样的“模拟器”可以理解并触发相应的事件,例如, “设备就绪”。到目前为止看起来很有希望: - )

发生了什么事?

@antscode的回答非常有帮助。经过一些挖掘和阅读https://github.com/apache/incubator-ripple代码后,我发现了

  • 错误来自于作为cordova插件架构一部分的机制。插件开发为所谓的 cordova命令,可以从js执行 - 这正是cordova架构的组织方式。
  • Cordova是一个JS框架。建议使用一个主要的(非本机)JS代码。要与所有这些不同的本机插件交谈,必须提出与它们通信的协议,使用JSON序列化的RPC。这正是自己的想法。
  • 插件也可以是纯JS。引用cordova/cordova-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.
    });

无模拟器解决方案

我可以想象一个相当复杂的应用程序会在这样一个Web浏览器客户端“模拟器”(仅在其中)中断的情况。一个更好的解决方案是找出一种方法来说服应用程序不要回退到PROMPT通信方法(产生恼人警报的方法)。 嗯,我现在没有这样的解决方案:-(很乐意学会如何做到这一点。

解决方案在这里:manual

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

或从此处下载: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>

并且没有更多弹出窗口

答案 4 :(得分:0)

我对另一位开发人员创建的项目遇到了同样的问题。我的原因是Cordova / PhoneGap 2.x配置的遗留问题。此弹出窗口与插件系统有关。从我的config.xml中删除插件使其更好:

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

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

答案 5 :(得分:0)

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

但这意味着您无法测试手机功能。

为了简要解释我的思考过程,在我开发的所有年份(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." );
});

答案 6 :(得分:-1)

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