uniapp实现被浏览器唤起的功能
uniapp中的配置
当用户打开h5 链接时候 ,点击打开app, 若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装
这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。这两个场景又分为了IOS端和安卓端。
安卓
安卓在manifest.json的"app-plus"->“distribute”->"android"节点下添加schemes数据:“schemes” : “nameAPP”
/* android打包配置 */
"android" : {
"schemes" : "hbuilder,xinhao",
...
}
旧的(仅供参考)
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
"android" : {
"schemes": ["xinhao"],
"permissions" : [
...
]
},
...
}
IOS
在manifest.json的"app-plus"->“distribute”->"ios"节点下添加urltypes数据:
/* ios打包配置 */
"ios" : {
"urltypes" : "hbuilder,xinhao",
"dSYMs" : false
},
旧的仅供参考
"distribute" : {
/* 重力感应、横竖屏配置 */
"distribute" : {
"orientation" : [ "portrait-primary" ]
},
/* android打包配置 */
"android" : {
"schemes": ["xinhao"],
"permissions" : [...]
},
/* ios打包配置 */
"ios" : {
"urltypes": [
{
// com.BBB.AAA
"urlidentifier" : "cn.qdxin",
"urlschemes" : [ "xinhao" ]
}
],
"urlschemewhitelist": [ "xinhao" ],
"dSYMs" : false
},
...
}
"urlschemewhitelist是白名单,urlidentifier一般为域名倒写
注意:字符串建议使用小写字母(不要使用特殊字符、中文等),如设置为"test",那么其他App呼起你的app的scheme协议就是"test://";
多个scheme使用 "," 分割,每个字符串为一个urltypes;如果可视化界面无法编辑,请切换到“源码视图”删除urltypes
节点数据重新操作。【这里官方最新的是使用字符串,等我尝试一下再来编辑】
这里推荐参考最新的官方介绍:
IOS:https://uniapp.dcloud.net.cn/tutorial/app-ios-schemes.html#
安卓:https://uniapp.dcloud.net.cn/tutorial/app-android-schemes.html#
网页传递以及APP接收参数
网页传递参数
1)微信直接打开的h5链接是不能直接换起app,需要单独处理
2)safari中只能通过loaction.href唤起app
3)无论安卓或者IOS都推荐实用window.location.href = ''去唤起app,不要实用window.open或者iframe,或者使用a标签去模拟:
function doClick(ahref) {
var this_a = document.createElement('a');
this_a.setAttribute('href', ahref);
// 向苹果传数据
// this_a.setAttribute('target', '_blank');
this_a.setAttribute('id', 'startTelMedicine');
// 防止反复添加
if (document.getElementById('startTelMedicine')) {
document.body.removeChild(document.getElementById('startTelMedicine'));
}
document.body.appendChild(this_a);
this_a.click();
}
比如使用的时候:
// 向安卓传数据
if (isAndroid) {
var ifrSrc = 'xinhao://cn.qdxin' + '?' + this_str;
// window.open(ifrSrc);
doClick(ifrSrc);
}
else if (isIos) {
var ahref ='xinhao://cn.qdxin' + '?' + this_str;
doClick(ahref);
}
其中_inviteCode为网页携带的inviteCode 参数;com.BBB.AAA不一定非要写成com.BBB.AAA,后面的?是一个符号,用于隔开前面的字符串和后面的参数,便于在app中取参数。另外打开APP尽量使用a标签,然后模拟点击事件,iframe方法仅仅在此做记录。
<div class="mark hide">
<div class="mark_info">
点击右上角
<br>
选择“在浏览器中打开”
</div>
</div>
<script>
$(function(){
var sys = 'android';
var isiOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
//获取url参数
var GetRequest = function(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
//打开app
var openApp = function(){
// 参数
var _inviteCode = GetRequest("inviteCode")
if(isiOS){
location.href = "xinhao://cn.qdxin?" + _inviteCode
}else{
var appOpenUrl = "xinhao://cn.qdxin?" + _inviteCode
//在iframe 中打开APP
var ifr = document.createElement('iframe');
ifr.src = appOpenUrl;
ifr.style.display = 'none';
document.body.appendChild(ifr);
setTimeout(function() {
document.body.removeChild(ifr);
}, 2000);
}
};
//是否是微信判断
var ua = window.navigator.userAgent.toLowerCase();
if (ua.match(/MicroMessenger/i) == "micromessenger") {
$('.mark').removeClass("hide")
}else{
openApp()
}
})
</script>
App接收参数
var args= plus.runtime.arguments;
if(args){
// 处理args参数,如直达到某新页面等
}
比如:
onShow: function() {
// #ifdef APP-PLUS
var args= plus.runtime.arguments;
let _inviteCode = args.split('?')[1]
if(args && _inviteCode){
console.log(_inviteCode)
}
// #endif
},
假设,打开的连接如下:
<a href="xinhao://cn.qdxin?sid=2&nid=293138" id="href">xinhao:</a>
那么,在app.vue的onshow中,args= plus.runtime.arguments;得到的字符串就是:
获取的参数args:xinhao://cn.qdxin?sid=2&nid=293138,所以处理的时候需要用?分割。
这时候还需要一个函数,将sid=2&nid=293138进行解析为对象:
export function parseQueryString(paramsStr) {
let params = {};
let arr = paramsStr.split("&");
for(var i = 0, l = arr.length; i < l; i++) {
let a = arr[i].split("=");
params[a[0]] = a[1];
}
return params;
}
清除urlscheme启动传递的参数(一定要这样,不然清不掉)
plus.runtime.arguments = null
plus.runtime.arguments = ''
注意:
onshow:
https://uniapp.dcloud.net.cn/tutorial/page.html#lifecycle
onShow | 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面 |
所以实际应用的时候,可能会有开屏广告、加载数据之类的操作,所以可以在app.vue中定义一个变量,只有onLaunch后,再触发onshow的时候才显示。
小米手机自带浏览器无法唤起uniapp
若是hbuilder打包web2app,可直接在manifest.json中的App常用其他配置中填写UrlSchemes即可,网页配置同以上
写好了之后记得需要打包自定义基座测试。
封装的插件
针对以上情况,我封装了一个插件,可以直接在网页中引用,会在下方出现下载的功能。以下是基本的逻辑思路:
案例:
http://code.wubin.work/code/js/app-guide/
简单的应用案例:
http://code.wubin.work/code/js/app-guide/test.html
插件JS:
http://code.wubin.work/code/js/app-guide/app-guide.js
插件的样式(通过JS动态插入)
http://code.wubin.work/code/js/app-guide/app-guide.css