最近接到项目新需求,H5项目需要内嵌到微信小程序和APP里,然后将H5页面分享出去,被分享的人可以点击消息跳转到H5页面。H5页面不难,难的是要与微信小程序和APP进行交互,因为以前也没有接触过,所以这里卡的时间有点长。现分享出来
这里小编使用的是 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",//H5消息的消息类型
messageData:{
shareTitle:"@你....!",//分享标题
shareImageUrl: "",//分享截图(小程序可以截当前分享页面图,当然也可以使用传过去的图)
sharePathUrl:"/pages/web-view/main",//分享小程序页面(如需要参数则此地址需要拼接,注意这里的参数有长度限制)
}
};
wx.miniProgram.postMessage({data:infoList});//必须使用 {data:infoList} 格式
}else{
console.log('分享时不在小程序里')
}
注意:这里的 infoList 里面所需参数名称皆为小程序那边的开发人员所规定的
main.js 全局引入的使用:
if(this.flagWeChat){ //判断是否为微信环境
//提前发送消息给小程序,初始化分享参数
let infoList = {
type:"share",//H5消息的消息类型
messageData:{
shareTitle:"@你.....",//分享标题
shareImageUrl: "",//分享截图
sharePathUrl:"/pages/web-view/main", //分享小程序页面
}
};
this.wx.miniProgram.postMessage({data:infoList})
}else{
console.log('分享时不在小程序里')
}
注意:h5能做的就是发送这一条消息给小程序,具体的分享还是要通过小程序头部自带的3个点
ps:这里的分享主要是小程序分享给微信好友的分享,发送给微信好友时会以消息卡片的形式分享出去。
在 APP 里内嵌H5页面,h5页面需要使用app定义的方法,首先需要app开发者把h5需要使用的方法公开到 window 中,这样h5才能使用。有的是需要引入js文件或是其他东西,这需要与app开发者协商。
// 判断当前运行环境 ios,安卓
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", //分享场景,friends代表微信好友
shareType:"miniProgram",//消息类型,miniProgram代表分享小程序
title:"@你.....",//分享标题
desc:"....",//分享描述
imageData: "",//图片地址
link:"",//分享小程序页面,此地址需要拼接,如:/pages/web-view/main?webViewData={linkUrl="xxxxx",isLoginNeeded=true,navigationTitle="xxxxxx"},其中 "linkUrl":"xxxxxx",//分享H5链接;"isLoginNeeded":false,//是否需要账号信息"navigationTitle","xxxx",目标页面标题,可不传
webPageUrl:""//网页地址,值与linkUrl值相同,主要用于兼容
}
// wechatShare是app提供的方法,我们只要在需要的地方调用就好
if(this.flagSystemAPP == "android"){
try {
// 安卓
//MoveCallNative 为安卓开发人员规定的名称,如若未特别规定则使用 window.android......
window.MoveCallNative.wechatShare(
JSON.stringify(shareInfo)
)
} catch (e) {
console.log('android分享错误--',e)
}
}else if(this.flagSystemAPP == "ios"){ //ios
try {
// ios
window.webkit.messageHandlers.wechatShare.postMessage(
JSON.stringify(shareInfo)
);
} catch (e) {
console.log('ios分享错误--',e)
}
}
注意:这里的 shareInfo 里所需参数名称皆为APP开发人员所规定
传参数时必须是字符串 JSON.stringify(shareInfo)
ps:这个分享也是分享给微信好友的分享,分享给好友时是以链接的形式分享的
分享出去的链接或卡片最终还是会回到H5页面,所以在H5页面需要接受参数,做出相应的操作
在 App.vue 页面接收参数,分割参数和目标页面路径
<script>
export default {
globalData:{ // 存放全局数据
familyDetail: {}, // 当前登录人的家庭数据
initPage: null, // 第一次进入页面的页面path
mbrid: null, // 去获取用户信息的参数
},
/* 程序初始化逻辑
1、获取用户初始化进入的相关数据,包括mid(用户身份标识),存储到全局变量
2、判断本地有没有token,有就去对应的页面,没有则拦截到授权页面
3、拦截前,保存第一次进入的页面地址,用于获取token后,去到该页面
*/
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>
/* auth页面,只做授权使用,去获取token*/
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);//app.vue里截获的参数
}
},
methods:{
async handleGetToken(mbrid) {
if(!mbrid) {
console.log('mbrid没有----')
uni.showToast({
title: '非法闯入',
icon: 'none'
})
return
}
const { code, data, msg } = await http_getWeChatLogin({ mbrId: mbrid }); //请求接口获取toke
if(code == 200) {
const { accessToken } = data
cache_set_token(accessToken) //存储toke
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 }); //跳转到app.vue里截获的路径
}
} else {
uni.showToast({
title: msg,
icon: 'none'
})
}
}
}
}
</script>
至此,整个分享过程完结
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie