我无法为此提出一个很好的解释,但是当我加入
时<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();
这当然不会在应用程序中破坏,但它确实意味着开发几乎是不可能的。
答案 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代码后,我发现了
使用以下命令创建一个新的 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文件以解决问题。