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

PhoneGap: Detect if running on desktop browser

我正在开发一个使用PhoneGap的Web应用程序:为移动版本构建,并希望有一个用于"桌面"和移动版本的单一代码库。我希望能够检测到PhoneGap呼叫是否有效(即,是支持PhoneGap的移动设备上的用户)。

我已经搜索过了,无法相信有任何简单的方法可以做到这一点。许多人提出了建议;

  • http://www.sencha.com/forum/showthread.php?144127检查是否在PhoneGap或移动Web浏览器中运行
  • http://groups.google.com/group/phonegap/browse ou thread/thread/322e80bd41bb1a54/a421300eb2a2029f?lnk=gst&q=detect+桌面a421300eb2a2029f
  • http://groups.google.com/group/phonegap/browse ou thread/thread/8a95dfeb0f313792/3f10d8f3521739?lnk=gst&q=detect+desktop+浏览器3ff10d8f3521739

所有这些都不起作用,除非你从桌面版本的应用程序中删除phonegap javascript文件,这违背了我拥有一个代码库的目标。

到目前为止,我提出的唯一解决方案是浏览器/用户代理嗅探,但至少可以说,这并不可靠。欢迎有更好的解决方案!

编辑:一个稍微好一点的解决方案是在一个小的超时之后尝试调用phonegap函数-如果它不起作用,那么假设用户在桌面Web浏览器上。


我用这个代码

1
2
3
4
5
if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry|IEMobile)/)) {
  document.addEventListener("deviceready", onDeviceReady, false);
} else {
  onDeviceReady(); //this is the browser
}

更新

有许多其他方法可以检测电话是否在浏览器上运行或不运行,这里是另一个重要的选择:

1
2
3
4
5
6
var app = document.URL.indexOf( 'http://' ) === -1 && document.URL.indexOf( 'https://' ) === -1;
if ( app ) {
    // PhoneGap application
} else {
    // Web page
}

移动浏览器或语音应用程序之间的检测


几天前我写了一篇关于它的文章。这是你能找到的最好的解决方案(直到PhoneGap发布一些东西,也许是,也许不是),它简短、简单、完美(我已经用各种可能的方式和平台检查过了它)。

该功能将在98%的情况下完成这项工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 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的文件,其来源:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- __phonegap_index.html -->
<script type="text/javascript">
    function isPhoneGap() {
        //the function's content is as described above
    }

    //ensure the 98% that this file is called from PhoneGap.
    //in case somebody accessed this file directly from the browser.
    if ( isPhoneGap() )
        localStorage.setItem("isPhoneGap","1");

    //and redirect to the main site file.
    window.location ="index.html";

现在,在本机上,只需将所有PhoneGap平台上的起始页从index.html更改为uPhoneGap Index.html。假设我的项目名是示例,您需要更改的文件是(对于PhoneGap版本2.2.0):

  • iOS-CordovaLibApp/AppDelegate.m
  • 安卓-src/org/apache/cordova/example/cordovaExample.java
  • Windows 8-example/package.appxmanifest
  • 黑莓-www/config.xml
  • webos-framework/appinfo.json
  • BADA-src/WebForm.cpp号线(56号线)
  • WindowsPhone7-不知道在哪里(有人还在那个平台上开发?!)

最后,如果它在PhoneGap上运行,您可以在站点的任何地方使用它:

1
2
3
4
5
if ( localStorage.getItem("isPhoneGap") ) {
    alert("Running on PhoneGap!");
} else {
    alert("Not running on PhoneGap!");
}

希望有帮助。-)


我知道这是一个答案,但"Phonegap.available"并不存在。你应该使用:

1
2
3
if (window.PhoneGap) {
  //do stuff
}

自1.7以来,优先考虑:

1
2
3
if (window.cordova) {
  //do stuff
}