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浏览器上。
- 既然您正在使用build,请参见下面的@b-t答案:stackoverflow.com/a/18478002/241244。似乎这比公认的和最有投票权的答案要好。
- 我避免运行时检测,而支持显式构建时配置,因为它100%有效。我只需将一个本地变量传递给index.jade模板,如isphonegap:true,然后在模板中有条件地包含phonegap.js脚本,并执行我想要的所有phonegap特定的init。
我用这个代码
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 } |
移动浏览器或语音应用程序之间的检测
- 谢谢你-在等了很长时间看别人的建议之后,这似乎是最好的解决办法。干杯。
- 这是不准确的,因为如果我在设备的浏览中打开同一页,OnDeviceReady()将永远不会调用。另外,如果我要更改浏览器中的useragent(出于调试目的),OnDeviceReady()也不会调用。
- 不知道你在说什么-但你似乎暗示这会导致使用手机浏览器的问题…这是一个在桌面浏览器而不是手机上测试的解决方案。
- 当您在设备浏览器中打开应用程序时,这没有帮助。更好的解决方案:检查window.cordova。在iPhone模拟器(浏览器)或Android设备(浏览器)上测试也应该检测到PhoneGap。我就是这样发展的。但是有很多可能完成工作。;-)用于发布解决方案的THX!
- 我很困惑,其他平台比如Windows Phone呢?他们有一个与正则表达式匹配的用户代理吗?快速的谷歌搜索意味着不会:madskristensen.net/post/windows-phone-7-user-agents.aspx
- 我相信如果你正在开发Windows Phone,你可以搜索"Windows Phone"或"IEMobile"。
- @斯拉夫基,这很敏锐!寻找标题--OP询问有关PhoneGap的问题。PhoneGap应用程序在WebView中运行,而不是在移动浏览器中运行,用户不能更改
user-agent 字符串。所以这个解决方案会很有魅力。 - @Mooreds:这是一个解决方案,据说覆盖了97%,甚至是最奇怪的移动浏览器。原始链接指向PHP代码。我厌倦了让它在JavaScript(这个JS工具)中工作,但我失败了,放弃了它。如果你还感兴趣的话,试着把它修好。
- 更好的解决方案是stackoverflow.com/a/12255930/519856
- 这很好,但是@slavikme-anwser's似乎更准确,应该是公认的。所以我对你投了反对票…没有冒犯!
几天前我写了一篇关于它的文章。这是你能找到的最好的解决方案(直到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!"); } |
希望有帮助。-)
- 找到了最好的答案!
- 这是使用外部网站测试的吗?就像网站不是在本地服务器上托管一样。
- @pyarego.com,是的,它是在外部网站上测试的。
- 是的,它可以工作,但有时代码的下一部分不是真的
/^file:\/{3}[^\/]/i.test(window.location.href) ,但我们使用的是phonegap,例如从另一个页面加载index.html时,在config.xml上,类似于此 。 - 如果没有定义这些变量中的任何一个,表达式
(cordova || PhoneGap || phonegap) 将抛出一个引用错误。你应该用typeof cordova !== undefined 测试,对吗? - @你说得对。我把第一条线路换成:
return ( typeof cordova !== undefined || typeof PhoneGap !== undefined || typeof phonegap !== undefined ) 。 - @rblakeley:也是这样。我也相信你是对的
- 这是为我工作的!如果要在浏览器中将其作为文件直接测试,则标记为"已接受"的文件将不起作用。
- @Rojobuffalo:看起来答案已经被修改了,使其再次按预期工作(即,由于
window 前缀,它不再抛出ReferenceError )。我想我会指出这一点,因为这实际上使评论链过时(因此,不正确)。
我知道这是一个答案,但"Phonegap.available"并不存在。你应该使用:
1 2 3 | if (window.PhoneGap) { //do stuff } |
自1.7以来,优先考虑:
1 2 3 | if (window.cordova) { //do stuff } |
- 这不是真的,因为如果您包括脚本cordova-x.x.x.x.js(即使它已加载到浏览器中),window.phonegap或window.cordova将一直被定义。
- 谢谢。正在检查window.cordova最适合我。
- 你能给我举个例子吗?简单地加载index.html。我要做的是,我已经在本地服务器上上载了www文件夹下的所有文件,我正在加载index.html。但是准备就绪的设备没有启动。
- 这似乎是现在的正确答案(至少有Cordova 3.4)。所有其他方法都只是浪费时间,因为现在用一个简单的
我认为这只是简单的:
var isPhoneGap = (location.protocol =="file:") 编辑对一些不工作的人来说然后你可以试着(没有试过)
1var isPhoneGap = ! /^http/.test(location.protocol);- 我以为PhoneGap运行了一个内部服务器来存储设备上的所有文件?
- 我喜欢。在本地主机上开发时,这是最好的解决方案。(在尝试了很多之后,我希望这在所有的场景中都有效,希望如此。)谢谢!
- 当我测试一个远程文件时,这个在Ripple模拟器中不起作用。
- 也不适用于WP8,协议是"x-wmap0:"。无法确定将来还会使用什么其他"协议"。
- 好吧,你也可以试试
var isPhoneGap = ! /^http/.test(document.location.protocol) 。 - 更好的是,用
location.protocol 代替document.location.protocol ! - 谢谢@andrewmilson。不知道
window.location 和document.location 的细微差别。实施。 - @yuval更简单,只需在location.toString()返回location.href时执行
!/^http/.test(location) 。 - 我不是高尔夫球运动的支持者。我更倾向于简洁和精确。但谢谢你的想法。
This works for me(running 1.7.0)
1
2
3if (window.device) {
// Running on PhoneGap
}测试桌面色彩和狩猎。
- 这几乎与绑定到"deviceReady"事件相同。如果未定义window.device,则无法判断phonegap/cordova的加载速度是否较慢,或者事件是否永远不会触发。
- 在触发"deviceReady"事件之前未定义window.device。
- 并祈祷没有其他程序员有定义一个称为"设备"的新的全局变量的好主意。
和最初的海报一样,我使用的是PhoneGap构建服务。经过两天的测试和近50次的构建,我想出了一个优雅的解决方案,它对我来说非常有用。
我不能使用UA嗅探,因为我想在移动浏览器中测试和运行。我最初决定用柯柏博男孩的功能性很强的技术。这对我不起作用,因为"howpatientrewe:10000"延迟/超时对于浏览器开发来说太麻烦了。如果将其设置得更低,则在应用程序/设备模式下测试偶尔会失败。必须有另一种方法…
PhoneGap构建服务要求在将应用程序的文件提交给服务之前,从代码存储库中省略
phonegap.js 文件。因此,我可以测试它的存在,以确定是否在浏览器和应用程序中运行。另一个警告是,我也在使用jquerymobile,所以jqm和phonegap在开始任何自定义脚本之前都必须初始化。以下代码放在应用程序的自定义index.js文件的开头(jquery之后,jqm之前)。此外,phonegap构建文档还表示将
放在HTML中的某个位置。我把它留下完全取出并使用$.GetScript()加载它,以方便测试它的存在。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42isPhoneGap = 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对象。如果它在那里,那么你最有可能在科尔多瓦示波器中运行。
1var isCordovaApp = !!window.cordova;2–Cordova会像从桌面打开HTML文档一样运行应用程序。它将使用文件而不是HTTP协议。检测到这一点将使您有机会假设您的应用程序是本地加载的。
1
2var isCordovaApp = document.URL.indexOf('http://') === -1
&& document.URL.indexOf('https://') === -1;。
3–使用cordova脚本的加载事件检测上下文。脚本include可以在构建过程中轻松删除,否则脚本加载将在浏览器中失败。这样就不会设置这个全局变量。
1<script src="../cordova.js" onload="javascript:window.isCordovaApp = true;">。
从Adobe到Damien Antia
我使用这种方法:
1debug = (window.cordova === undefined);。
debug 在浏览器环境中为true ,在设备上为false 。这似乎可行,我在生产中使用过:
1
2
3
4
5
6
7
8if (document.location.protocol =="file:") {
// file protocol indicates phonegap
document.addEventListener("deviceready", function() { $(initInternal);} , false);
}
else {
// no phonegap, start initialisation immediately
$(initInternal);
}。
来源:http://tqcblog.com/2012/05/09/detecting-phonegap-cordova-on-startup/
我使用的方法是使用一个全局变量,该变量被一个仅限浏览器的cordova.js版本覆盖。在您的主HTML文件(通常是
index.html 文件)中,我有以下依赖于顺序的脚本:1
2
3
4var __cordovaRunningOnBrowser__ = false
<script src="cordova.js"> <!-- must be included after __cordovaRunningOnBrowser__ is initialized -->
<script src="index.js"> <!-- must be included after cordova.js so that __cordovaRunningOnBrowser__ is set correctly -->在
cordova.js 的内部,我只是:1__cordovaRunningOnBrowser__ = true。
在构建移动设备时,不会使用cordova.js(而是使用平台特定的cordova.js文件),因此无论协议、用户代理或库变量(可能会发生变化),此方法都具有100%正确性的优点。在cordova.js中可能还有其他的内容,但我不知道它们是什么。
- 非常有趣的方法。
- 不过,您并不真正需要初始脚本。你可以测试一下它是否被设置好:
if ( typeof __cordovaRunningOnBrowser__ !== 'undefined' ) { stuff(); } ..对吧? - 是的,如果它没有被定义,可能意味着其他的事情是错误的。
另一种方式,基于Slavikme的解决方案:
只需使用从PhoneGap源传递给
index.html 的查询参数。也就是说,在Android中,而不是1super.loadUrl("file:///android_asset/www/index.html");使用
1super.loadUrl("file:///android_asset/www/index.html?phonegap=1");号
Slavikme有一个很好的列表,上面列出了在其他平台上在哪里执行此操作。
那么你的
index.html 可以简单地做到:1
2
3
4
5
6if (window.location.href.match(/phonegap=1/)) {
alert("phonegap");
}
else {
alert("not phonegap");
}- 我使用的是cordova 3.4.1,它更简单:只需将config.xml文件中的
选项更改为 。到目前为止,这似乎是可行的,也是目前为止最好的解决方案。
问题的本质是,Cordova.Device的时间如此之长,如果Cordova已经确定你的设备无法承受,或者如果Cordova仍在准备自我和设备,则无法确定你的代码(或第三种选择:Cordova没有装载)。预付款
唯一的解决办法是确定一个等待期,并决定在这个等待期之后,你的代码必须承担设备。我希望Cordova能在某个地方设置一个参数,说"我们试过找到一个支撑装置,给它一个支撑装置",但它似乎没有这样的参数。
一旦建立了这一点,你可能想在没有支持设备的情况下做一些特殊的精确的事情。就像隐藏链接到设备的应用市场
我在一起的这个功能应该覆盖很多美丽的情况。这说明你有一个准备好的手机,一个从未准备好的手机,一个等待时间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50//Deals with the possibility that the code will run on a non-phoneGap supported
//device such as desktop browsers. Gives several options including waiting a while
//for cordova to load after all.
//In:
//onceReady (function) - performed as soon as deviceready fires
//patience
// (int) - time to wait before establishing that cordova will never load
// (boolean false) - don't wait: assume that deviceready will never fire
//neverReady
// (function) - performed once it's established deviceready will never fire
// (boolean true) - if deviceready will never fire, run onceReady anyhow
// (boolean false or undefined) - if deviceready will never fire, do nothing
function deviceReadyOrNot(onceReady,patience,neverReady){
if (!window.cordova){
console.log('Cordova was not loaded when it should have been')
if (typeof neverReady =="function"){neverReady();}
//If phoneGap script loaded...
} else {
//And device is ready by now...
if (cordova.device){
callback();
//...or it's loaded but device is not ready
} else {
//...we might run the callback after
if (typeof patience =="number"){
//Run the callback as soon as deviceready fires
document.addEventListener('deviceready.patience',function(){
if (typeof onceReady =="function"){onceReady();}
})
//Set a timeout to disable the listener
window.setTimeout(function(){
//If patience has run out, unbind the handler
$(document).unbind('deviceready.patience');
//If desired, manually run the callback right now
if (typeof neverReady == 'function'){neverReady();}
},patience);
//...or we might just do nothing
} else {
//Don't bind a deviceready handler: assume it will never happen
if (typeof neverReady == 'function'){neverReady();}
else if (neverReady === true){onceReady();}
else {
//Do nothing
}
}
}
}
}为了保持一个代码库,最感兴趣的是运行代码的"平台"。对我来说,这个"平台"可以是三种不同的东西:
- 0:计算机浏览器
- 1:移动浏览器
- 2:PhoneGap/科多瓦
检查平台的方法:
1
2
3
4
5
6
7
8var platform;
try {
cordova.exec(function (param) {
platform = 2;
}, function (err) {},"Echo","echo", ["test"]);
} catch (e) {
platform = 'ontouchstart' in document.documentElement ? 1 : 0;
}注:
只有在加载cordova.js之后才能运行此命令(body onload(…),$(document).ready(…))
document.documentElement中的"ontouchStart"将出现在具有触摸屏的笔记本电脑和桌面显示器中,因此即使是桌面,它也会报告移动浏览器。有不同的方法可以进行更精确的检查,但我使用它是因为它仍然可以处理99%的我需要的案例。你可以用那条线来代替更健壮的线。
- 我建议使用
typeof cordova !== 'undefined' ,而不是捕鱼。
以下内容适用于我最近的PhoneGap/Cordova(2.1.0)。
工作原理:
- 概念非常简单
- 我颠倒了上面一些超时解决方案的逻辑。
- 注册设备就绪事件(根据PhoneGap文档的建议)
- 如果事件在超时后仍未激发,请回退到假定浏览器。
- 相反,上面的其他解决方案依赖于测试某些PhoneGap特性或其他特性,并观察它们的测试中断。
优势:
- 使用PhoneGap推荐的设备就绪事件。
- 移动应用程序没有延迟。一旦设备就绪事件触发,我们就继续。
- 没有用户代理嗅探(我喜欢将我的应用程序作为移动网站进行测试,因此浏览器嗅探不是我的选择)。
- 不依赖未记录的(因此是脆弱的)音素间隙特性/属性。
- 即使使用桌面或移动浏览器,也要将cordova.js保存在代码库中。因此,这就回答了OP的问题。
- 怀兹在上面说:"我希望科多瓦能在某个地方设置一个参数来表示"我们已经尝试找到一个支持的设备并放弃了",但似乎没有这样的参数。"所以我在这里提供了一个参数。
缺点:
- 超时是讨厌的。但我们的移动应用程序逻辑并不依赖于延迟;相反,当我们处于Web浏览器模式时,它被用作回退。
=
创建一个全新的空白PhoneGap项目。在提供的示例index.js中,将底部的"app"变量替换为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62var app = {
// denotes whether we are within a mobile device (otherwise we're in a browser)
iAmPhoneGap: false,
// how long should we wait for PhoneGap to say the device is ready.
howPatientAreWe: 10000,
// id of the 'too_impatient' timeout
timeoutID: null,
// id of the 'impatience_remaining' interval reporting.
impatienceProgressIntervalID: null,
// Application Constructor
initialize: function() {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// `load`, `deviceready`, `offline`, and `online`.
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
// after 10 seconds, if we still think we're NOT phonegap, give up.
app.timeoutID = window.setTimeout(function(appReference) {
if (!app.iAmPhoneGap) // jeepers, this has taken too long.
// manually trigger (fudge) the receivedEvent() method.
appReference.receivedEvent('too_impatient');
}, howPatientAreWe, this);
// keep us updated on the console about how much longer to wait.
app.impatienceProgressIntervalID = window.setInterval(function areWeThereYet() {
if (typeof areWeThereYet.howLongLeft =="undefined") {
areWeThereYet.howLongLeft = app.howPatientAreWe; // create a static variable
}
areWeThereYet.howLongLeft -= 1000; // not so much longer to wait.
console.log("areWeThereYet: Will give PhoneGap another" + areWeThereYet.howLongLeft +"ms");
}, 1000);
},
// deviceready Event Handler
//
// The scope of `this` is the event. In order to call the `receivedEvent`
// function, we must explicity call `app.receivedEvent(...);`
onDeviceReady: function() {
app.iAmPhoneGap = true; // We have a device.
app.receivedEvent('deviceready');
// clear the 'too_impatient' timeout .
window.clearTimeout(app.timeoutID);
},
// Update DOM on a Received Event
receivedEvent: function(id) {
// clear the"areWeThereYet" reporting.
window.clearInterval(app.impatienceProgressIntervalID);
console.log('Received Event: ' + id);
myCustomJS(app.iAmPhoneGap); // run my application.
}
};
app.initialize();
function myCustomJS(trueIfIAmPhoneGap) {
// put your custom javascript here.
alert("I am"+ (trueIfIAmPhoneGap?"PhoneGap":"a Browser"));
}
Georgew's solution is okay,but even on real device,Phonegap.Available is only true after Phonegap's things has been loaded,E.G.Ondeviceready in document.addeventlistener("设备准备",Ondeviceready,False)has been called.
在那之前,如果你想知道,你可以这样做:
ZZU1
这一解决方案假定,使用铬或菲利福克斯来发展最快。
- OP正在为生产网站寻找解决方案,而不仅仅是开发。
即使模拟设备处于活动状态,也检测桌面浏览器适用于Windows和Mac计算机。需要找到Linux视图详细信息的解决方案
1
2
3
4
5
6
7
8
9
10var mobileDevice = false;
if(navigator.userAgent.match(/iPhone|iPad|iPod|Android|BlackBerry|IEMobile/))
mobileDevice = true;
if(mobileDevice && navigator.platform.match(/Win|Mac/i))
mobileDevice = false; // This is desktop browser emulator
if(mobileDevice) {
// include cordova files
}
None of which work, unless you remove the PhoneGap Javascript file from the desktop version of the app, which defeats my goal of having one codebase.
号
另一个选择是使用合并文件夹,请参见下面的屏幕截图。
您可以添加特定于平台的文件/覆盖默认文件。
(在某些情况下,它应该会起作用)
。
换言之:与检测浏览器不同,您只是不包括某些用于桌面构建/附加的文件,这些文件仅用于iOS。
几个月前,当我们开始使用我们的应用程序时,我偶然发现了这个问题,因为我们还希望该应用程序是"EDOCX1"(6)(理解到在这种情况下某些功能会被阻塞:录音、指南针等)。
唯一能够预先确定应用程序执行上下文的
100% (我坚持100%条件)解决方案是:将JS"flag"变量初始化为true,并在所有Web上下文中将其更改为false;
因此,您可以使用类似"
willIBeInPhoneGapSometimesInTheNearFuture() "的调用(这是pre-pg,当然,您还需要一个post-pg方法来检查是否可以调用pg api,但是这个方法很简单)。然后你说:"以东十一〔九〕号?"答案是:"你不能"(因为我认为你不能可靠,除非PG的那些聪明人会在他们的API代码中这样做);
您可以编写一个构建脚本来完成它:一个带有两个变体的代码库。
我也有同样的问题。
我是Leaning towards adding 35;Cordova=true to the URL loaded by the Cordova client and testing for location.hash.indexof("Cordova=true")1 in my web page.
- 最后,我按照雷诺在他的第四点建议的路线走,让构建脚本决定。在将网站代码复制到android assets文件夹中时,它取消了index.html中的标志的注释。//uncomment-on-deploy:window.u appinfo.iscordova=true;当构建脚本将index.html复制到我的android assets/www文件夹时,我运行该脚本以删除//uncomment-on-deploy:string。#message index.html告诉它正在运行cordova ed"$dest/index.html"<<-eof 1,$s///uncomment-on-deploy://w q eof
这不是问题的真正答案,但是当我在桌面浏览器中测试时,我只是设置了一个本地存储值,使浏览器加载应用程序Dispate设备,而不是启动。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function main() {
// Initiating the app here.
};
/* Listen for ready events from pheongap */
document.addEventListener("deviceready", main, false);
// When testing outside ipad app, use jquerys ready event instead.
$(function() {
if (localStorage["notPhonegap"]) {
main();
}
});。
亚伦,尝试
1
2
3if (PhoneGap.available){
do PhoneGap stuff;
}- 你刚刚补足了吗?大声笑
- 不,我没有。查看phonegap-1.1.0.js源代码。phoneGap.available=设备信息.uuid!==未定义;
- 这个人说实话!
- 只有在触发"DeviceReady"事件后,此选项才可用。
1
2
3
4
5if ("device" in window ) {
// phonegap
} else {
// browser
}我想在某些方面他们没有那么不同吧?哈哈。。。不好笑。谁不认为这是个问题?下面是您考虑的最简单的解决方案。将不同的文件推送到服务器,然后再推到PhoneGap。我也会暂时使用上面建议的http:check。
1var isMobileBrowserAndNotPhoneGap = (document.location.protocol =="http:");我的兴趣是将浏览器导航栏向上推,所以我真的可以删除独立脚本的标签,然后按rebuild[在dw中](它们无论如何都是一些部署清理,所以这可以是其中一个任务。)不管怎样,我觉得这是一个很好的选择(考虑到没有太多其他可用的东西),只需在推到pg时用ismobilebrowserandnotphonegap手动注释。对于我来说,在我的情况下,我将简单地删除(独立代码)文件的标签,当它是一个移动浏览器时,它会向上推导航栏(它会更快、更小)。[因此,如果您可以隔离该优化但手动解决方案的代码。]
Try this approach:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25/**
* Returns true if the application is running on an actual mobile device.
*/
function isOnDevice(){
return navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/);
}
function isDeviceiOS(){
return navigator.userAgent.match(/(iPhone)/);
}
/**
* Method for invoking functions once the DOM and the device are ready. This is
* a replacement function for the JQuery provided method i.e.
* $(document).ready(...).
*/
function invokeOnReady(callback){
$(document).ready(function(){
if (isOnDevice()) {
document.addEventListener("deviceready", callback, false);
} else {
invoke(callback);
}
});
}
事实上,我在这里找到了两种技术的组合,这两种技术都是最好的,首先是检查一下Cordova/Phonegap是否可以获得设备。就像这样
1
2
3
4
5
6
7
8
9
10
11function _initialize() {
//do stuff
}
if (window.cordova && window.device) {
document.addEventListener('deviceready', function () {
_initialize();
}, false);
} else {
_initialize();
}只是想了解一下PhoneGap 3.x移动应用程序开发热点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39var userLocale ="en-US";
function startApp()
{
// do translations, format numbers, etc.
}
function getLocaleAndStartApp()
{
navigator.globalization.getLocaleName (
function (locale) {
userLocale = locale.value;
startApp();
},
function () {
// error; start app anyway
startApp();
});
}
function executeWhenReady ( callback ) {
var executed = false;
document.addEventListener ("deviceready", function () {
if (!executed) {
executed = true;
if (typeof callback ==="function") {
callback();
}
}
}, false);
setTimeout ( function () {
if (!executed) {
executed = true;
if (typeof callback ==="function") {
callback();
}
}
}, 1000 );
};
executeWhenReady ( function() {
getLocaleAndStartApp();
} );在Yasmf框架中
https://github.com/photokandsudios/yasmf next/blob/master/lib/yasmf/util/core.js l152
1
2
3if (document.URL.includes('http')) {
// running in browser
}号
同时处理HTTP和HTTPS。
我尝试使用窗口对象,但当我在InAppBrowser中打开远程URL时,它没有起作用。无法完成。因此,实现这一点的最好和最简单的方法是在URL上附加一个字符串,您需要从PhoneGap应用程序中打开该字符串。然后检查文档位置是否附加了字符串。
Below is the simple code for it
号
1var ref = window.open('http://yourdomain.org#phonegap', '_blank', 'location=yes');。
您将看到一个字符串被添加到URL"phonegap"中,因此在域URL中添加以下脚本
1
2
3if(window.location.indexOf("#phonegap") > -1){
alert("Url Loaded in the phonegap App");
}号
稍微修改一下,但对我来说完全没有问题。
目的是只在嵌入式设备上加载cordova,而不是在桌面上,所以我完全避免在桌面浏览器上加载cordova。UI和MVVM等的测试和开发非常舒适。
把这个代码放在cordovaloader.js文件中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15function isEmbedded() {
return
// maybe you can test for better conditions
//&& /^file:\/{3}[^\/]/i.test(window.location.href) &&
/ios|iphone|ipod|ipad|android/i.test(navigator.userAgent);
}
if ( isEmbedded() )
{
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'cordova-2.7.0.js';
head.appendChild(script);
}。
然后不包括cordova javascript本身,而是包括cordovaloader.js
1
2
3
4
5
6<head>
<script src="js/cordovaLoader.js">
<script src="js/jquery.js">
<script src="js/iscroll.js">
<script src="js/knockout-2.3.0.js">
</head>。
放松你的工作!:)
我使用了乔治和MKprogramming建议的组合:
1
2
3
4
5
6
7if (!navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) {
onDeviceReady();
} else if (Phonegap.available){
onDeviceReady();
} else {
console.log('There was an error loading Phonegap.')
}