端开发
最近遇到一个需求,需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载。这是一个很正常的推广和导流量的策略。前端小白从来没有做过这个需求,只能开始哼唧哼唧地开启自己的度娘和谷歌之旅。
经过一段时间的探索之旅发现里面的学问很多,要做一个兼容性很好的方案,就需要考虑各种情况,在不同的情况适配不同的方案,比方说用户是在手机浏览器打开还是微信中打开,或者是在pc中打开,universal腾讯应用宝直接打开 APP link是否被关闭等,这就使代码实现变得复杂,且容易出错,且还有安卓平台机型众多、浏览器众多等导致的兼容问题。由于时间有限,这次主要先介绍一个比较普遍的使用URL Scheme进行App跳转的方法。
来源
一般来说,我们使用的智能设备上有许多我们的个人信息。比如:联系方式、银行卡/信用卡信息、支付宝/Paypal/各大商城的账户密码、照片甚至行程与位置信息等。
如果说,你设备上的每一个应用,不管是官方的还是你从任何商城安装的应用都可以随意地获取这些信息,那么你轻则收到骚扰信息和邮件、重则后果不堪设想。如何让这些信息不被其它应用随意使用,或者说,如何让这些信息仅在设备所有者本人知情并允许的情况下被使用,是所有智能设备与操作系统所要在乎的核心安全问题。针对这个问题,苹果使用了名为「沙盒」的机制:应用只能访问它声明可能访问的资源。一切提交到 App Store 的应用都必须遵守这个机制。
在安全方面沙盒是个很好的解决办法,但是有些矫枉过正。敏感的个人信息我们不愿意透露,却不代表所有的信息我们都不想与其它应用共享。因此,我们急需要一个辅助工具来帮助我们实现应用通信, URL Schemes 就是这个工具。
[scheme]://[host]/[path]?[query]
我们拿 https://www.baidu.com 来举例,scheme 自然就是 https 了,后面拼接的是传递的参数。URL Schemes 没有特别严格的规范,所以后面参数的具体定义是app开发者去自定义。
就像给服务器资源分配一个 URL,以便我们去访问它一样,我们同样也可以给手机APP分配一个特殊格式的 URL,用来访问这个APP或者这个APP中的某个功能(来实现通信)。APP得有一个标识,好让我们可以定位到它,它就是 URL 的 Scheme 部分。
但是,两者还有几个重要的区别:
前面普及了一下URL Schemes的相关知识,作为个前端开发者,就不去深究其中的原理,都交给app开发者吧。接下来开始我们的正题。首先当然是要客户端提供App的Url Schemes。
在浏览器中打开 scheme 就像打开一个不同的http地址一样。可以在一个 a 标签中打开。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>打开App</title> </head> <body> <a href="luwei://" id="open">打开应用</a> </body> </html>
点击上面的H5页面中的链接将会尝试唤醒对应app,在一些浏览器中,可能会弹出一个提示框,询问用户是否允许打开应用。
如果打开的 scheme 在本地没有对应的 app,则点击不会反应。
当然还可以使用 JavaScript 代码打开,只需要添加相应的事件触发和处理即可。
在JavaScript代码中打开连接有以下几种方式:
// 打开url的方式 var urlOpen={ // 在ios支持不好 'iframe' : function(url) { var iframe=document.createElement('iframe'); iframe.style.display='none'; iframe.src=url; document.body.appendChild(iframe); }, 'location' : function(url) { window.location.href=url; }, 'href' : function(url) { var a=document.createElement('a'); a.style.display='none'; a.href=url; document.body.appendChild(a); a.click(); }, 'script' : function(url) { var script=document.createElement('script'); script.setAttribute('type', 'test/javascript'); script.innerHTML='(function(){' + 'var a=document.createElement("a");' + 'a.style.display="none";' + 'a.href="' + url.replace(/"/g, '\\"') + '";' + 'document.body.appendChild(a);' + 'a.click();' + '})()'; document.body.appendChild(script); }, 'open' : function(url) { window.open(url); } };
以上方法是只是解决了在已安装App设备唤醒App的功能,并不能判断是否已安装App,没有安装即跳转至下载链接。
浏览器判断是否安装应用
在浏览器实际上是没有能力判断手机里是否安装了某个App的,所以只能够采取一种投机取巧的方式。
在JavaScript中判断页面是否进入后台来判断打开成功。Html5提供了下列事件和属性可以利用:
上面这些事件或者属性并不是所有浏览器都支持。下面是一个给出为id为openBtn 的按钮添加打开scheme或者下载事件的例子,但对于Android 4.4版本以下则不支持
var downloader, scheme='luwei://', // 需要打开的app scheme 地址 iosDownload='http://xxx.com'; // 如果打开scheme失效的app下载地址 andDownload='http://xxx.com'; var u=navigator.userAgent; var isAndroid=u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g var isIOS=!!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 // 给 id 为 openBtn 的按钮添加点击事件处理函数 document.getElementById('openBtn').onclick=function () { window.location.href=scheme; // 尝试打开 scheme // 设置3秒的定时下载任务,3秒之后下载app downloader=setTimeout(function(){ if(isAndroid) { window.location.href=andDownload; } if(isIOS) { window.location.href=iosDownload; } }, 3000); }; document.addEventListener('visibilitychange webkitvisibilitychange', function () { // 如果页面隐藏,推测打开scheme成功,清除下载任务 if (document.hidden || document.webkitHidden) { clearTimeout(downloader); } }); window.addEventListener('pagehide', function() { clearTimeout(downloader); });
起唤醒是目前非常流行的一款智能亮屏息屏app,根据用户的手势及使用习惯来决定屏幕的光亮及解锁程度,实现自动化操作的目的,并且此软件的耗电量与内存占比都非常小,不会影响手机的正常使用,能够适配于不同的机型,并且通过精准的传感系统防止出现误触的情况。
放下关屏
亮屏但未解锁时,放下手机可自动关屏
轻拍亮/关屏
锁屏状态下,轻拍放在桌上的手机顶部,自动亮屏
若有新通知点亮屏幕,不想理会,也可轻拍关屏
翻转锁屏
任何状态下,手机屏幕朝下放置自动锁屏
后台隐藏
在后台任务界面中隐藏本软件(强迫症福音)
兼容锁屏模式
适用于三星、索尼等机型,解锁时可使用指纹
支持无障碍,视障人士也可在软件内顺利操作
由于抬手唤醒功能的特殊性,加上各家系统差异较大(包括刷非官方ROM的),初期无法保证适配率。
来源:http://www.3h3.com/az/201589.html
者:suan_suanhttps://segmentfault.com/a/1190000018661914
H5 唤醒APP功能
最近遇到一个需求,需要在从APP分享出去的H5页面中,带有一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载。
这是一个很正常的推广和导流量的策略。前端小白从来没有做过这个需求,只能开始哼唧哼唧地开启自己的度娘和谷歌之旅。
经过一段时间的探索之旅发现里面的学问很多,要做一个兼容性很好的方案,就需要考虑各种情况,在不同的情况适配不同的方案。
比方说用户是在手机浏览器打开还是微信中打开,或者是在pc中打开,universal腾讯应用宝直接打开 APP link是否被关闭等,这就使代码实现变得复杂,且容易出错,且还有安卓平台机型众多、浏览器众多等导致的兼容问题。
由于时间有限,这次主要先介绍一个比较普遍的使用URL Scheme进行App跳转的方法。
URL Scheme —— 唤端媒介
来源
一般来说,我们使用的智能设备上有许多我们的个人信息。
比如:联系方式、银行卡/信用卡信息、支付宝/Paypal/各大商城的账户密码、照片甚至行程与位置信息等。
如果说,你设备上的每一个应用,不管是官方的还是你从任何商城安装的应用都可以随意地获取这些信息,那么你轻则收到骚扰信息和邮件、重则后果不堪设想。
如何让这些信息不被其它应用随意使用,或者说,如何让这些信息仅在设备所有者本人知情并允许的情况下被使用,是所有智能设备与操作系统所要在乎的核心安全问题。
针对这个问题,苹果使用了名为「沙盒」的机制:应用只能访问它声明可能访问的资源。一切提交到 App Store 的应用都必须遵守这个机制。
在安全方面沙盒是个很好的解决办法,但是有些矫枉过正。敏感的个人信息我们不愿意透露,却不代表所有的信息我们都不想与其它应用共享。
因此,我们急需要一个辅助工具来帮助我们实现应用通信, URL Schemes 就是这个工具。
URL Schemes是什么
[scheme]://[host]/[path]?[query]
我们拿 https://www.baidu.com 来举例,scheme 自然就是 https 了,后面拼接的是传递的参数。
URL Schemes 没有特别严格的规范,所以后面参数的具体定义是app开发者去自定义。
就像给服务器资源分配一个 URL,以便我们去访问它一样,我们同样也可以给手机APP分配一个特殊格式的 URL,用来访问这个APP或者这个APP中的某个功能(来实现通信)。
APP得有一个标识,好让我们可以定位到它,它就是 URL 的 Scheme 部分。
但是,两者还有几个重要的区别:
前面普及了一下URL Schemes的相关知识,作为个前端开发者,就不去深究其中的原理,都交给app开发者吧。
接下来开始我们的正题。首先当然是要客户端提供App的Url Schemes。
用浏览器去打开scheme
在浏览器中打开 scheme 就像打开一个不同的http地址一样。可以在一个 a 标签中打开。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>打开App</title>
</head>
<body>
<a href="luwei://" id="open">打开应用</a>
</body>
</html>
点击上面的H5页面中的链接将会尝试唤醒对应app,在一些浏览器中,可能会弹出一个提示框,询问用户是否允许打开应用。
如果打开的 scheme 在本地没有对应的 app,则点击不会反应。
当然还可以使用 JavaScript 代码打开,只需要添加相应的事件触发和处理即可。
在JavaScript代码中打开连接有以下几种方式:
// 打开url的方式
var urlOpen={
// 在ios支持不好
'iframe' : function(url) {
var iframe=document.createElement('iframe');
iframe.style.display='none';
iframe.src=url;
document.body.appendChild(iframe);
},
'location' : function(url) {
window.location.href=url;
},
'href' : function(url) {
var a=document.createElement('a');
a.style.display='none';
a.href=url;
document.body.appendChild(a);
a.click();
},
'script' : function(url) {
var script=document.createElement('script');
script.setAttribute('type', 'test/javascript');
script.innerHTML='(function(){' +
'var a=document.createElement("a");' +
'a.style.display="none";' +
'a.href="' + url.replace(/"/g, '\"') + '";' +
'document.body.appendChild(a);' +
'a.click();' +
'})()';
document.body.appendChild(script);
},
'open' : function(url) {
window.open(url);
}
};
以上方法是只是解决了在已安装App设备唤醒App的功能,并不能判断是否已安装App,没有安装即跳转至下载链接。
浏览器判断是否安装应用
在浏览器实际上是没有能力判断手机里是否安装了某个App的,所以只能够采取一种投机取巧的方式。
在JavaScript中判断页面是否进入后台来判断打开成功。Html5提供了下列事件和属性可以利用:
上面这些事件或者属性并不是所有浏览器都支持。下面是一个给出为id为openBtn 的按钮添加打开scheme或者下载事件的例子,但对于Android 4.4版本以下则不支持
var downloader,
scheme='luwei://', // 需要打开的app scheme 地址
iosDownload='http://xxx.com'; // 如果打开scheme失效的app下载地址
andDownload='http://xxx.com';
var u=navigator.userAgent;
var isAndroid=u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //g
var isIOS=!!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
// 给 id 为 openBtn 的按钮添加点击事件处理函数
document.getElementById('openBtn').onclick=function () {
window.location.href=scheme; // 尝试打开 scheme
// 设置3秒的定时下载任务,3秒之后下载app
downloader=setTimeout(function(){
if(isAndroid) {
window.location.href=andDownload;
}
if(isIOS) {
window.location.href=iosDownload;
}
}, 3000);
};
document.addEventListener('visibilitychange webkitvisibilitychange', function () {
// 如果页面隐藏,推测打开scheme成功,清除下载任务
if (document.hidden || document.webkitHidden) {
clearTimeout(downloader);
}
});
window.addEventListener('pagehide', function() {
clearTimeout(downloader);
});
没有完美的方案
以上就是今天的知识分享啦~
如果大家有问题或者想了解更多的
技术干货可以私信发送【微信】添加朗妹儿微信哟~
*请认真填写需求信息,我们会在24小时内与您取得联系。