前言
最近接到项目新需求,H5项目需要内嵌到微信小程序和APP里,然后将H5页面分享出去,被分享的人可以点击消息跳转到H5页面。H5页面不难,难的是要与微信小程序和APP进行交互,因为以前也没有接触过,所以这里卡的时间有点长。现分享出来
小程序内嵌H5页面
介绍
这里小编使用的是 uinapp 写的H5项目!!! H5页面放入小程序中,需要使用小程序的一个组件 web-view 微信官方文档 官方文档中有详细介绍,H5页面主要需要的API为 相关接口1
准备工作
其中 wx.miniProgram.postMessage 这个API就是H5做分享功能的主要的接口,在使用它之前还要下载 JSSDK ,这个 JSSDK.js文件 在官方文档中可以下载,然后放到你的项目中引入使用。 还可以使用 npm 下载: 用 npm install weixin-js-sdk 或 npm install weixin-jsapi
正式开发
export function isWx() {
return /MicroMessenger/i.test(window.navigator.userAgent)
}
引入
使用 npm 下载的,在项目的 main.js 文件中引入 jssdk ,这样就能在项目中全局使用: 官方文档中下载的,在需要使用 jssdk 的页面中引入使用:
页面使用
单页面引入jssdk的使用:
if(this.flagWeChat){
let infoList = {
type:"share",
messageData:{
shareTitle:"@你....!",
shareImageUrl: "",
sharePathUrl:"/pages/web-view/main",
}
};
wx.miniProgram.postMessage({data:infoList});
}else{
console.log('分享时不在小程序里')
}
注意:这里的 infoList 里面所需参数名称皆为小程序那边的开发人员所规定的
main.js 全局引入的使用:
if(this.flagWeChat){
let infoList = {
type:"share",
messageData:{
shareTitle:"@你.....",
shareImageUrl: "",
sharePathUrl:"/pages/web-view/main",
}
};
this.wx.miniProgram.postMessage({data:infoList})
}else{
console.log('分享时不在小程序里')
}
注意:h5能做的就是发送这一条消息给小程序,具体的分享还是要通过小程序头部自带的3个点
ps:这里的分享主要是小程序分享给微信好友的分享,发送给微信好友时会以消息卡片的形式分享出去。
APP内嵌H5页面
介绍
在 APP 里内嵌H5页面,h5页面需要使用app定义的方法,首先需要app开发者把h5需要使用的方法公开到 window 中,这样h5才能使用。有的是需要引入js文件或是其他东西,这需要与app开发者协商。
正式开发
export function myProgramEnv() {
if(/Android/i.test(window.navigator.userAgent)) {
return 'android'
}
if(/ipad|iphone/i.test(window.navigator.userAgent)) {
return 'ios'
}
}
页面使用
let shareInfo = {
shareScene:"friends",
shareType:"miniProgram",
title:"@你.....",
desc:"....",
imageData: "",
link:"",
webPageUrl:""
}
if(this.flagSystemAPP == "android"){
try {
window.MoveCallNative.wechatShare(
JSON.stringify(shareInfo)
)
} catch (e) {
console.log('android分享错误--',e)
}
}else if(this.flagSystemAPP == "ios"){
try {
window.webkit.messageHandlers.wechatShare.postMessage(
JSON.stringify(shareInfo)
);
} catch (e) {
console.log('ios分享错误--',e)
}
}
注意:这里的 shareInfo 里所需参数名称皆为APP开发人员所规定
传参数时必须是字符串 JSON.stringify(shareInfo)
ps:这个分享也是分享给微信好友的分享,分享给好友时是以链接的形式分享的
H5页面
介绍
分享出去的链接或卡片最终还是会回到H5页面,所以在H5页面需要接受参数,做出相应的操作
正式开发
在 App.vue 页面接收参数,分割参数和目标页面路径
<script>
export default {
globalData:{
familyDetail: {},
initPage: null,
mbrid: null,
},
onLaunch: function(option) {
console.log('App.vue初始化数据option---', option)
if(window.location.search){
let parameter = window.location.search.split('mbrid=')[1].split('#')[0];
console.log('App.vue初始化数据mbrid---', parameter);
getApp().globalData.mbrid = parameter;
}else{
console.log('路径未带参数---')
}
getApp().globalData.initPage = window.location.hash.substr(1);
uni.reLaunch({url: '/pages/auth/auth'});
return
},
onShow: function() {
},
onHide: function() {
},
methods: {
}
}
</script>
授权页面:授权和跳转到目标页面
<script>
import { http_getWeChatLogin } from '@/common/api/index.js'
import { cache_set_token } from 'common/utils/cache.js'
import { ENV } from 'common/utils/constant.js'
export default{
data() {
return {}
},
onLoad(option) {
console.log('auth.vue初始数据:getApp().globalData---:',getApp().globalData)
if(['AY_DEV'].includes(ENV)) {
this.handleGetToken('1');
} else {
this.handleGetToken(getApp().globalData.mbrid);
}
},
methods:{
async handleGetToken(mbrid) {
if(!mbrid) {
console.log('mbrid没有----')
uni.showToast({
title: '非法闯入',
icon: 'none'
})
return
}
const { code, data, msg } = await http_getWeChatLogin({ mbrId: mbrid });
if(code == 200) {
const { accessToken } = data
cache_set_token(accessToken)
getApp().globalData.familyDetail = data;
if(getApp().globalData.initPage.indexOf('pages/auth/auth') > -1) {
uni.reLaunch({url: '/pages/client_side/activity/activity' });
} else {
uni.reLaunch({url: getApp().globalData.initPage });
}
} else {
uni.showToast({
title: msg,
icon: 'none'
})
}
}
}
}
</script>
至此,整个分享过程完结
|