当前位置:  开发笔记 > 编程语言 > 正文

PhoneGap:检测是否在桌面浏览器上运行

如何解决《PhoneGap:检测是否在桌面浏览器上运行》经验,为你挑选了9个好方法。

我正在开发一个使用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浏览器上.



1> sirmdawg..:

我用这个代码:

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应用程序之间进行检测


这是不准确的,因为如果我将在设备的浏览中打开相同的页面,onDeviceReady()将永远不会调用.另外,如果我将在浏览器中更改UserAgent(出于调试目的),onDeviceReady()将永远不会调用.
在设备浏览器中打开应用程序时,这无济于事.更好的解决方案:检查window.cordova.在iPhone模拟器(浏览器)或Android设备(浏览器)上进行测试也应检测PhoneGap.这就是我发展的方式.但要完成任务有很多可能性.;-)发布解决方案的Thx!
不确定你在说什么 - 但似乎你暗示这会导致使用手机浏览器出现问题...这是一个在桌面浏览器而不是手机上测试的解决方案.

2> Slavik Melts..:

几天前我写了一篇关于它的帖子.这是你可以找到的最佳解决方案(直到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!");
}

希望能帮助到你.:-)


发现这个答案是最好的!
是的它有效,但有时代码的下一部分不是真的`/ ^ file:\/{3} [^\/]/i.test(window.location.href)`但是我们正在使用PhoneGap,例如从另一个页面加载index.html,在config.xml上就像这样``
如果没有定义任何变量,表达式`(cordova || PhoneGap || phonegap)`将抛出一个ReferenceError.你应该测试`typeof cordova!== undefined`,对吧?

3> fredericrous..:

我知道它已经被回答了一段时间,但"PhoneGap.available"不再存在了.你应该使用:

if (window.PhoneGap) {
  //do stuff
}

或者自1.7以来,更喜欢:

if (window.cordova) {
  //do stuff
}


事实并非如此,因为如果包含脚本cordova-xxxjs,即使它已加载到浏览器上,也会定义window.PhoneGap或window.cordova.
现在这似乎是正确的答案(至少使用Cordova 3.4).所有其他方法只是浪费时间,因为现在使用简单的HTML中的某个位置.我把它完全抛弃并使用$ .getScript()加载它来测试它的存在.

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!
    }
}



8> Frodik..:

有趣的是,许多答案,但他们不包括这三个选项:

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



9> andreszs..:

我用这个方法:

debug = (window.cordova === undefined);

debugtrue在浏览器环境中,false在设备上.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有