现在经常有写场景需要提示用户下载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通信,监听窗口失去焦点事件)的更多相关文章

  1. js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法

    js捕捉IE窗口失去焦点事件,判断离开页面刷新或关闭的方法 javascript如何捕捉IE窗口失去焦点事件window.onblur = function(e) { //you code}; 弹框的 ...

  2. Android如何监听蓝牙耳机的按键事件(转)

    源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...

  3. Android怎样监听蓝牙耳机的按键事件

    Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...

  4. JS控制全屏,监听退出全屏事件

    实现方案 //进入全屏 function requestFullScreen(de) { if(de.requestFullscreen){ //W3C de.requestFullscreen(); ...

  5. js判断设备,跳转app应用、android市场或者AppStore

    js移动设备判断方法大全 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" > ...

  6. Android APP的安装路径

    转载自:http://blog.csdn.net/libaineu2004/article/details/25247711 一.安装路径在哪? Android应用安装涉及到如下几个目录: syste ...

  7. js判断操作系统windows,ios,android(笔记)

    使用JS判断用户使用的系统是利用浏览器的userAgent. navigator.userAgent:userAgent 获取了浏览器用于 HTTP 请求的用户代理头的值. navigator.pla ...

  8. js 判断当前操作系统 ios, android, 电脑端

    一 .   js判断移动端的操作系统(ios或Android) $(function () { var u = navigator.userAgent; var isAndroid = u.index ...

  9. Android : App客户端与后台服务的AIDL通信以及后台服务的JNI接口实现

    一.APP客户端进程与后台服务进程的AIDL通信 AIDL(Android Interface definition language-“接口定义语言”) 是 Android 提供的一种进程间通信 ( ...

随机推荐

  1. SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关

    0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...

  2. HTML标记语言

    一.html的文档结构 html含义为超文本标记语言,html文档重要由4个标签来组成就是<html>  <head>  <title>  <body> ...

  3. python开发流程及项目目录规范

    # 项目开发流程 1.调研 2.需求分析   ---产品经理 3.任务分配   ---项目经理 4.写项目demo   ---项目经理.架构师.程序猿 5.架构分析   ---项目经理.架构师 6.编 ...

  4. javascript_变量

    首先说说变量,JavaScript变量可以用来保存两种类型的值:基本类型和引用类型. 1,基本类型很好理解,源于基本数据类型:underfined,null,boolean,number和string ...

  5. Python学习笔记–Chapter 2

    1.字符串中添加制表符,可使用字符组合\t 2.字符串中添加换行符,可使用字符组合\n 3.字符串\n\t可以换到下一行,并且在开头添加一个制表符. 4.删除末尾空白,使用方法rstrip() 5.删 ...

  6. Centos7.4下安装Jumpserver 1.0.0(支持windows组件)

    0)系统环境CentOS 7.4 IP: 192.168.100.10 [root@jumpserver-server ~]# cat /etc/redhat-release CentOS Linux ...

  7. Python基础:六、变量和常量

    一.变量 1. 变量: 将运算的中间结果暂存到内存,以便后续程序调用 2. 变量的作用: 代指内存里某个地址中保存的内容 3. 变量的命名规则: 1. 变量由字母.数字.下划线搭配组合而成 2. 不可 ...

  8. Python基础:五、Python程序的编写方式

    python程序有两种编写方式: 1. 进入cmd控制台(linux终端),输入python进入编辑模式,这时候我们可以直接编写python程序 2. 也可以在.py文件中编写python代码,通过p ...

  9. 关于 legend_noa

    真名:qlw 性别:男 常用ID:legend_noa(有时候也用fseject以表示我的弱, 曾经不懂事用goddess_Q),具体意思是我最喜欢的两个奥特曼:诺亚和雷杰多 p1 诺亚,p2 雷杰多 ...

  10. numpy用法

    NumPy中创建特殊值 np.nan    np.inf nan表示数据空缺   inf表示无穷 参考:https://www.cnblogs.com/haoxi/p/9175781.html