小程序分享功能开发1.接触小程序不久,在第一次开发分享功能的过程中遇到了些许波折,此文介绍在小程序中,如何应对不同业务场景下的分享功能开发需求。
功能介绍2.小程序转发分享功能,跟开发相关的内容并不多,主要通过onShareAppMessage定制页面分享内容,但有两个重要约束:
无法从代码内触发转发,只能通过open-type="share"的按钮在页面内触发转发内容(title、url、imageUrl)需要同步返回3.这两个约束,对实际业务的开发带来了不小的影响,如果需要用户在一个操作内保存数据并分享,因为上述两个限制,该功能就能很难实现,因为保存,涉及网络请求,必然是异步的。
异步指定分享内容的解决方案4.这里提供两种解决方案,都是曲线救国,多少有些瑕疵。
方案一5.将用户行为拆分为两个步骤,先保存数据,成功后再由用户主动分享给他人。这种方案在技术上相比第二种更为安全,但在某些业务场景下,用户体验并不完美,比如“给好友发送xxx”这种场景模式。
方案二6.在用户分享成功后再保存数据,采用这个方案需要结合具体业务思考,标准是:“数据如果没有保存成功,会造成多大的影响与后果?是不是可接受的?”。
7.常规POST/CREATE操作,一般数据ID都是后端负责生成,操作成功后接口返回ID,但为了面对目前这种情况,在接口设计上需要做出部分调整:
尽最大可能降低接口的失败可能性保存数据时支持指定ID为避免ID冲突,后端提供ID预生成接口8.其他的就不过多废话了,一切尽在代码中:
Page({data:{id:null},onLoad:function(){returnthis.fetchId();},onShow:function(){if(!this.loading&&!this.data.id){returnthis.fetchId();}},onShareAppMessage:function(){if(!this.data.id){//todo返回默认分享信息,比如小程序首页}return{title:'xxx',path:'xxx?id='+this.data.id,success:function(res){if(this.data.savedId===this.data.id){return;}this.saveData().then(()={this.setData({savedId:this.data.id});//todo如果跳转到其他页面,删除this.data.id});}};},fetchId:function(){//fetchidandsettodata},saveData:function(){//savedatatoserver}});canvas绘制分享图片9.针对上一部分,如果分享内容是异步生成的,往往分享图片也是动态的(非固定的本地资源或者网络资源)。
10.针对动态分享图片,通常有两种解决方案:
服务器动态生成所需图片11.依赖服务器的图片处理功能,灵活合成所需图片,缺点很明显,图片处理会消耗过多的服务器资源,影响服务器整体吞吐量
客户端使用canvas绘制动态图片12.在客户端本地使用canvas绘制内容,最后通过wx.canvasToTempFilePath保存图片临时路径用于分享,这种方式的缺点:兼容性不够好,可能遇到各种BUG
13.在第一次开发过程中,选择了canvas绘制分享图片,主要步骤如下:
在wxml文件中声明canvas区块14.此处有一个主意事项:canvas区块应该不影响布局且不可见,但经过实践发现不能使用display:none;或opacity:0;这种方式。最终摸索出一种可行方式:使用view容器包裹canvas,然后设置view的style为height:0;overflow:hidden;
15.在js中通过wx.createCanvasContext获取绘图上下文
16.通过上下文使用canvas相关api绘图
17.使用wx.canvasToTempFilePath获取图片路径
18.这种方式的优点是不依赖服务器,节省了服务器性能开销,但是也有一个致命缺点:图片生成是异步的,与onShareAppMessage需要同步返回数据有冲突。
19.为解决该问题,采取的方案是在影响分享图片因素变化时,立即重新生成,且需要考虑失败时的替代图片。这种做法,因为频繁的使用canvas绘制与保存图片,可能会影响小程序的运行流畅度。
20.最后贴上针对输入框内容动态生成分享图片的核心代码:
App({drawLock:false,//避免同时对一个canvas进行操作shareImageCache:{},//尽可能优化drawShareImage:function(canvasId,ctx,text){if(this.drawLock){return;}this.drawLock=true;letthat=this;letcacheKey=util.hash(text);if(this.shareImageCache[cacheKey]){returnPromise.resolve(this.shareImageCache[cacheKey]);}ctx.clearRect(0,0,500,400);returnnewPromise(resolve,reject={ctx.setFillStyle('#333333');ctx.setFontSize(40);ctx.fillText(text,20,60);ctx.draw(true,()={promisify(wx.canvasToTempFilePath)({canvasId:canvasId}).then(res={this.drawLock=false;that.shareImageCache[cacheKey]=res.tempFilePath;resolve(res.tempFilePath);}).catch(err={this.drawLock=false;reject(err);});});});}});Page({data:{canvasId:'share-canvas',},shareImagePath:null,onLoad:function(){this.ctx=wx.createCanvasContext(this.data.canvasId);this.drawShare();},onInput:function(){if(this.preInputTimer){clearTimeout(this.preInputTimer);}this.preInputTimer=setTimeout(()={this.drawShare();},1000);//这个数字最好是比一般人连续输入时间间隔大一丢丢},drawShare:function(){returnapp.drawShareImage(this.data.canvasId,this.ctx,e.detail.value).then(path={this.shareImagePath=path;}).catch(err={logger.error(err);});}});21.以上代码是从自己小程序代码中提炼的部分内容,把绘制行为放在app中,是为了与其他页面共享。
22.上述是一个极端例子,因为用户的输入实时反馈到分享图片上,如果在产品层面考虑变通,可能会有更好的思路与解决方案。
23.博客原文
小程序分享接口-小程序分享功能开发-小程序分享
浏览量:1747
时间:
来源:shasharoman
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。












