我正在开发一个使用PhoneGap的Web应用程序:针对移动版本构建,并希望为"桌面"和移动版本提供单一代码库.我希望能够检测PhoneGap呼叫是否有效(即,移动设备上的用户是否支持PhoneGap).
我搜索过,无法相信没有简单的方法可以做到这一点.很多人提出了建议;
http://www.sencha.com/forum/showthread.php?144127-Checking-if-running-in-PhoneGap-or-Mobile-Web-Browser
http://groups.google.com/group/phonegap/browse_thread/thread/322e80bd41bb1a54/a421300eb2a2029f?lnk=gst&q=detect+desktop#a421300eb2a2029f
http://groups.google.com/group/phonegap/browse_thread/thread/8a95dfeb0f313792/3ff10d8f35211739?lnk=gst&q=detect+desktop+browser#3ff10d8f35211739
除非您从应用程序的桌面版本中删除PhoneGap Javascript文件,否则这些都无法正常工作,这会破坏我拥有一个代码库的目标.
到目前为止,我提出的唯一解决方案是浏览器/用户代理嗅探,但至少可以说这并不健全.欢迎任何更好的解决方
编辑:一个稍微好一点的解决方案是尝试在一些小的超时后调用PhoneGap函数 - 如果它不起作用,则假设用户在桌面Web浏览器上.
我用这个代码:
if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|IEMobile)/)) { document.addEventListener("deviceready", onDeviceReady, false); } else { onDeviceReady(); //this is the browser }
UPDATE
还有很多其他方法可以检测是否在浏览器上运行了phonegap,这是另一个很好的选择:
var app = document.URL.indexOf( 'http://' ) === -1 && document.URL.indexOf( 'https://' ) === -1; if ( app ) { // PhoneGap application } else { // Web page }
如下所示:在移动浏览器或PhoneGap应用程序之间进行检测
几天前我写了一篇关于它的帖子.这是你可以找到的最佳解决方案(直到PhoneGap会发布一些东西,可能或者可能不会发布),它简短,完整(我已经以各种可能的方式和平台进行了检查).
这个功能可以完成98%的情况.
/** * Determine whether the file loaded from PhoneGap or not */ function isPhoneGap() { return (window.cordova || window.PhoneGap || window.phonegap) && /^file:\/{3}[^\/]/i.test(window.location.href) && /ios|iphone|ipod|ipad|android/i.test(navigator.userAgent); } if ( isPhoneGap() ) { alert("Running on PhoneGap!"); } else { alert("Not running on PhoneGap!"); }
要完成其他2%的情况,请按照以下步骤操作(它涉及对本机代码的轻微更改):
使用源创建一个名为__phonegap_index.html的文件:
现在,在本机上只需将所有PhoneGap平台上的起始页面从index.html更改为__phonegap_index.html即可.假设我的项目名称是示例,您需要更改的文件是(如PhoneGap 2.2.0版):
iOS -CordovaLibApp/AppDelegate.m
Android -src/org/apache/cordova/example/cordovaExample.java
Windows 8 -example/package.appxmanifest
黑莓 -www/config.xml
WebOS -framework/appinfo.json
巴达 - src/WebForm.cpp
(第56行)
Window Phone 7 - 不知道哪里(有人还在那个平台上开发?!)
最后,如果它在PhoneGap上运行,您可以在网站的任何位置使用它:
if ( localStorage.getItem("isPhoneGap") ) { alert("Running on PhoneGap!"); } else { alert("Not running on PhoneGap!"); }
希望能帮助到你.:-)
我知道它已经被回答了一段时间,但"PhoneGap.available"不再存在了.你应该使用:
if (window.PhoneGap) { //do stuff }
或者自1.7以来,更喜欢:
if (window.cordova) { //do stuff }
isPhoneGap = false; isPhoneGapReady = false; isjQMReady = false; $.getScript("phonegap.js") .done(function () { isPhoneGap = true; document.addEventListener("deviceready", function () { console.log("phonegap ready - device/app mode"); isPhoneGapReady = true; Application.checkReadyState(); }, false); }) .fail(function () { console.log("phonegap load failed - browser only"); isPhoneGapReady = true; Application.checkReadyState(); }); $(document).bind("mobileinit", function () { Application.mobileInit(); $(document).one("pageinit", "#Your_First_jQM_Page", function () { isjQMReady = true; Application.checkReadyState(); }); }); Application = { checkReadyState: function () { if (isjQMReady && isPhoneGapReady) { Application.ready(); } }, mobileInit: function () { // jQM initialization settings go here // i.e. $.mobile.defaultPageTransition = 'slide'; }, ready: function () { // Both phonegap (if available) and jQM are fired up and ready // let the custom scripting begin! } }
有趣的是,许多答案,但他们不包括这三个选项:
1 - cordova.js将把cordova对象设置在全局范围内.如果它在那里,那么你很可能在Cordova范围内运行.
var isCordovaApp = !!window.cordova;
2 - Cordova将运行您的应用程序,就像从桌面打开HTML文档一样.它将使用FILE而不是HTTP协议.检测到这一点可以让您有机会假设您的应用已在本地加载.
var isCordovaApp = document.URL.indexOf('http://') === -1 && document.URL.indexOf('https://') === -1;
3 - 使用cordova脚本的load事件来检测上下文.脚本包含可以在构建过程中轻松删除,或者脚本加载只会在浏览器中失败.这样就不会设置这个全局变量.
幸得达Antipa从Adobe
我用这个方法:
debug = (window.cordova === undefined);
debug
将true
在浏览器环境中,false
在设备上.