js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)
现在经常有写场景需要提示用户下载app, 但是如果用户已经安装,我们希望是直接打开app。
实际上,js是没有判断app是否已经安装的方法的,我们只能曲线救国。
首先,我们需要有call起app的schema, 以及下载地址,比如:
var schema = 'myApp://main';
var downUrl = 'https://yourmain.com/downloadUrlTag';
一、使用websocket通信实现页端和app的通信
1. android app需要实现websocket的连接功能,开放一个特定的端口如8899;
2. 页端js建立websocket连接
var download = function (schema, downUrl) {
var ws = "ws://localhost:8899/websocket";
function onMessage(event) {
if (event.data != 'SUCCESS') {
console.log(event.data + "!= 'SUCCESS'");
window.location.href = downUrl;
}
socket.close();
}
function onError(event) {
console.log("websocket error");
window.location.href = downUrl;
}
function onOpen() {
}
function onClose() {
}
// 判断浏览器
if (navigator.userAgent.match(/android/i) && (navigator.userAgent.match(/Chrome/) || navigator.userAgent.match(/Opera/))) {
if (window.WebSocket) {
try {
socket = new WebSocket(ws);
} catch (ex) {
window.location.href = downUrl;
}
var message = "";
socket.onmessage = onMessage;
socket.onopen = onOpen;
socket.onclose = onClose;
socket.onerror = onError;
if (socket.readyState == WebSocket.CONNECTING) {
setTimeout(function () { // websocket建立连接需要一段时间
if (socket.readyState == WebSocket.OPEN) {
if (schema != '') {
window.location.href = schema;
socket.send(message);
}
} else {
socket = new WebSocket(ws);
if (socket.readyState != WebSocket.OPEN) {
window.location.href = downUrl;
}
}
}, 1000);
}
}
} else {
window.location.href = downUrl;
}
};
当点击下载按钮的时候,调用download(schema,downUrl)方法即可。
但是这种方法存在一个严重的问题:当app不在进程中存活时,我们是无法成功call起的,这样,我们就需要在客户端做一些工作,让你的app一直存活在进程中。
二、监听当前页面是否失去焦点,来判断是否需要调用下载
首先,我们的想法是,当用户点击下载后,先尝试call起APP,使用setTimeout做延时处理,在延时中判断是否call起成功,如果不成功,则直接下载,我们如何认为call其成功呢,当一个应用被调用的时候,浏览器会被隐藏,那么当前页面会失去焦点。
这种情况适用于国外使用chrome和uc browser的环境,国内手机浏览器百花齐放,各类厂商对deeplink都有不同的处理方式,所以兼容性不好。
var isBlur = false;
location.href = schema;
setTimeout(function() {
if (!isBlur) {
location.href = url;
}
}, 1000);
那么如何来设置isBlur的值呢,这里提供两种方法:
1. 监听window的blur事件
// window 每次失去焦点
window.onblur = function() {
console.log('失去焦点');
isBlur = true;
}; // window 每次获得焦点
// window.onfocus = function() {
// console.log('获得焦点');
// isBlur = false;
// }
2. 自定义事件监听visibilityChange事件,来判断document的hidden属性,
简单写法:
document.addEventListener("visibilitychange", function(){
console.log(document.hidden ? "失去焦点" : "获得焦点");
isBlur = document.hidden;
});
兼容写法:
var hiddenProperty = 'hidden' in document ? 'hidden' :
'webkitHidden' in document ? 'webkitHidden' :
'mozHidden' in document ? 'mozHidden' :
null;
var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
var onVisibilityChange = function(){
if (!document[hiddenProperty]) {
console.log('获得焦点');
isBlur = false;
} else {
console.log('失去焦点');
isBlur = true;
}
}
document.addEventListener(visibilityChangeEvent, onVisibilityChange);
完整代码:
var download = function() {
var isBlur = false;
location.href = schema;
setTimeout(function() {
if (!isBlur) {
location.href = url;
}
}, 1000);
// window 每次失去焦点
window.onblur = function() {
console.log('失去焦点');
isBlur = true;
};
var hiddenProperty = 'hidden' in document ? 'hidden' :
'webkitHidden' in document ? 'webkitHidden' :
'mozHidden' in document ? 'mozHidden' :
null;
var visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
var onVisibilityChange = function(){
if (document[hiddenProperty]) {
console.log('失去焦点');
isBlur = true;
}
}
document.addEventListener(visibilityChangeEvent, onVisibilityChange);
}
如果有哪里写的不对的,欢迎讨论!
js判断是否安装某个android app,没有安装下载该应用(websocket通信,监听窗口失去焦点事件)的更多相关文章
- js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法
js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法 javascript如何捕捉IE窗口失去焦点事件window.onblur = function(e) { //you code}; 弹框的 ...
- Android如何监听蓝牙耳机的按键事件(转)
源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...
- Android怎样监听蓝牙耳机的按键事件
Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...
- JS控制全屏,监听退出全屏事件
实现方案 //进入全屏 function requestFullScreen(de) { if(de.requestFullscreen){ //W3C de.requestFullscreen(); ...
- js判断设备,跳转app应用、android市场或者AppStore
js移动设备判断方法大全 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" > ...
- Android APP的安装路径
转载自:http://blog.csdn.net/libaineu2004/article/details/25247711 一.安装路径在哪? Android应用安装涉及到如下几个目录: syste ...
- js判断操作系统windows,ios,android(笔记)
使用JS判断用户使用的系统是利用浏览器的userAgent. navigator.userAgent:userAgent 获取了浏览器用于 HTTP 请求的用户代理头的值. navigator.pla ...
- js 判断当前操作系统 ios, android, 电脑端
一 . js判断移动端的操作系统(ios或Android) $(function () { var u = navigator.userAgent; var isAndroid = u.index ...
- Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现
一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...
随机推荐
- Ubuntu 的 bash和dash的区别
什么是bash ? Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh.csh.ash.bsh.ks ...
- ThreadPoolExecutor 几个疑惑与解答
任务是否都要先放入队列? 当工作线程数小于核心线程数时,任务是不会经过队列,而是直接创建 Worker 时传入.但是如果工作线程数已经大于核心线程数,则任务是要先放入队列的.实际上只要是被创建的工作线 ...
- office2013 Word 缺少校对工具,按提示下载、安装了文件还是不成功的解决方案
找到你的office安装源iso镜像加载 ——点开镜像双击setup.exe ——选择添加或删除功能 ——下一步——其他的不要动,展开office共享功能项 ——找到校对工具点出下拉项(点朝下的黑色箭 ...
- 使用min-device-pixel-ratio媒体功能实现真正的1像素border
关于设备像素比的知识,想必做过移动端开发的都有接触,这里就不介绍啦,万一有不懂的可以看张鑫旭大神的设备像素比devicePixelRatio简单介绍 由于设备像素比存在的原因,我们在处理设计图的一些边 ...
- vue实战 - 车牌号校验和银行校验
在看这篇文章之前,我建议大伙可以去把项目demo拉到本地看看.如果觉得写得不好,可以一起提提issues,一起维护.或者大伙有刚需,可以留言,后期会不断完善. 使用方法: git clone http ...
- UEditor之实现配置简单的图片上传示例 转
http://blog.csdn.net/huangwenyi1010/article/details/51637427 + http://blog.csdn.net/cr135810/article ...
- oracle控制文件问题
下午时连接数据库突然发现连不上了,监听报错找不到服务,于是登录数据库所在服务器,查看监听状态,oracle:lsnrctl status 监听状态正常,登入数据库查看[oracle@frkdb1 ~] ...
- Python 模块调用的变量与路径
自己编写的python代码经常需要分模块文件以及包,梳理一下调用顺序.执行顺序.工作路径.函数与变量等 工作路径 首先是工作路径,当模块代码放在统一的包内的时候,其路径和外层的包路径不同,当作为主调用 ...
- Linux下RabbitMQ的安装 开机自启动
1.官网下载地址 下载 RabbitMQ 和 erlang.我下载的是rabbitmq-server-3.6.10-1.el7.noarch.rpm和erlang-19.0.4-1.el7.cento ...
- 5. Web vulnerability scanners (网页漏洞扫描器 20个)
5. Web vulnerability scanners (网页漏洞扫描器 20个) Burp Suite是攻击Web应用程序的集成平台. 它包含各种工具,它们之间有许多接口,旨在方便和加快攻击应用 ...