收藏
评论

越过山丘-微盟小程序开发问题的解决之道

本文整理了微盟小程序开发过程中遇到的一些问题,快看看你遇到的问题这里有没有答案吧!


问题一:

iOS时间转换问题怎么解决?pc端调试、安卓机都能正常执行,iOS上time的结果是null

 var resData = '2017-3-14 10:03:45'  

 console.log("返回时间:" + resData)  

 var time = Date.parse(new Date(resData)) ;

 console.log(time);


解决方案:

将 '-' 替换成 '/'

resData = resData.replace(/-/g, '/');


问题二:

直播过程中可能会开始、暂停、继续、结束,客户端需要相应的做暂停和播放、结束,我们是希望通过消息的发送来通知到客户端,但是腾讯云IM的API调接口发群消息,限制 100次/秒,满足不了我们的需求


解决方案:

两点。

1、客户端轮询我们的接口,查询播放状态,舍弃。因为客户端数量过大时,服务端扛不住。

2、操作管理后台界面做轮询,一旦暂停,发送消息。客户端接口通过特定code跟普通消息做区分。


问题三:

storage不可以共用,小程序和插件之间数据共享有问题怎么解决呢?


解决方案:

插件使用小程序的共用方法(该方法由插件初始化时从构造函数传入),可以通过此方法从小程序发起请求、存储数据等。


问题四:

小程序的10层跳转限制怎么破?


解决方案:

判断一下当前页面长度是否达到10级,达到10级用redirectTo,未达到用navigateTo

var jumpUrl = function (data) {

     let pages = getCurrentPages();

     if (pages.length >= 10) {

       wx.redirectTo({

         url: data

       })

     } else {

       wx.navigateTo({

         url: data

       })

     }

   }


问题五:

浮点运算的精度问题一般怎么解决?


解决方案:

先转成整数,再进行运算,最后进行除法运算。

列举一个减法运算:

   function accSub(arg1, arg2) {

     var r1, r2, m, n;

     try {

       r1 = arg1.toString().split(".")[1].length;

     }

     catch (e) {

       r1 = 0;

     }

     try {

       r2 = arg2.toString().split(".")[1].length;

     }

     catch (e) {

       r2 = 0;

     }

     m = Math.pow(10, Math.max(r1, r2));  //动态控制精度长度

     n = (r1 >= r2) ? r1 : r2;

     return ((arg1 * m - arg2 * m) / m).toFixed(n);

   }


问题六:

小程序二维码scene的长度限制最多32位可见字符,这个有什么妙招吗


解决方案:

1、中间页 + 短参数

     新建一个中间空白跳转页面,每次生成的二维码都是这个页面,

     访问这个页面时,将参数中的scene的值,去指定接口获取完整的 带参数的链接,

     然后跳转过去,适用于一个解决方案中有很多个页面需要生成二维码来跳转;

2、短参数

     二维码指向到特定页面,scene值为短参数,进入页面时请求接口获取完整的参数(json格式);


问题七:

还有一个图片预加载问题,有些活动图片太多太大,且不确定使用哪张图片,接口返回数据时即刻显示图片可能出现短暂空白的问题


解决方案:

分三步,你需要建立一个图片预加载器

1、js

   /**

    * 图片预加载组件

    */


   class ImgLoader {

     /**

      * 初始化方法,在页面的 onLoad 方法中调用,传入 Page 对象及图片加载完成的默认回调

      */

     constructor(pageContext, defaultCallback) {

       this.page = pageContext

       this.defaultCallback = defaultCallback || function () { }

       this.callbacks = {}

       this.imgInfo = {}


       this.page.data.imgLoadList = [] //下载队列

       this.page._imgOnLoad = this._imgOnLoad.bind(this)

this.page._imgOnLoadError=

this._imgOnLoadError.bind(this)

     }


     /**

      * 加载图片

      *

      * @param  {String}   src      图片地址

      * @param  {Function} callback 加载完成后的回调(可选),第一个参数个错误信息,第二个为图片信息

      */

     load(src, callback) {

       if (!src) return;


       let list = this.page.data.imgLoadList,

         imgInfo = this.imgInfo[src]


       if (callback)

         this.callbacks[src] = callback


       //已经加载成功过的,直接回调

       if (imgInfo) {

         this._runCallback(null, {

           src: src,

           width: imgInfo.width,

           height: imgInfo.height

         })


         //新的未在下载队列中的

       } else if (list.indexOf(src) == -1) {

         list.push(src)

         this.page.setData({ 'imgLoadList': list })

       }

     }


     _imgOnLoad(ev) {

       let src = ev.currentTarget.dataset.src,

         width = ev.detail.width,

         height = ev.detail.height


       //记录已下载图片的尺寸信息

       this.imgInfo[src] = { width, height }

       this._removeFromLoadList(src)


       this._runCallback(null, { src, width, height })

     }


     _imgOnLoadError(ev) {

       let src = ev.currentTarget.dataset.src

       this._removeFromLoadList(src)

       this._runCallback('Loading failed', { src })

     }


     //将图片从下载队列中移除

     _removeFromLoadList(src) {

       let list = this.page.data.imgLoadList

       list.splice(list.indexOf(src), 1)

       this.page.setData({ 'imgLoadList': list })

     }


     //执行回调

     _runCallback(err, data) {

 let callback = this.callbacks[data.src] || this.defaultCallback

       callback(err, data)

       delete this.callbacks[data.src]

     }

   }


   module.exports = ImgLoader


2、wxml

   <template name="img-loader">

     <image mode="aspectFill" wx:for="{{ imgLoadList }}" wx:key="*this" src="{{ item }}" data-src="{{ item }}" bindload="_imgOnLoad" binderror="_imgOnLoadError" style="width:0;height:0;opacity:0" />

   </template>


3、使用

   let images = [

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/shoulie.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/shandian.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/fengbao.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/yingren.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/leiming.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/caidao.png',

     'http://cdn.weimob.com/saas/activity/bargain/images/arms/liehen.png'

   ]

   //初始化图片预加载组件,并指定统一的加载完成回调

   this.imgLoader = new ImgLoader(this, null);

   images.forEach(item => {

     this.imgLoader.load(item)

   })


问题八:

服务端时间和客户端时间问题,实际项目中有很多倒计时存在,服务端和客户端时间不对应会引起错乱。


解决方案:

将服务器时间通过接口下发给客户端,计算出二者的差值,计算倒计时的时候,可以将客户端时间加上这个差值来,再跟开始时间或结束时间计算倒计时。


如果你还有什么问题,欢迎在下方留言,我们会尽力为你解答。

最后一次编辑于  2018-10-09
收藏

3 个评论

  • 子墨
    子墨
    2018-12-11

    您好,微盟应该也是有第三方平台开发项目,最近我们平台遇到一个问题,就是授权到我们平台用户很多,当版本更新或紧急修bug的时候,会提示7天内提交数量过多!这种情况你们是否遇到过,有没有什么解决方案?谢谢

    2018-12-11
    赞同
    回复 2
    • 微盟
      微盟
      2018-12-11

      这个情况,我好像没碰到过哎,😓,不知道我们公司其他同事有碰到过么。。。

      2018-12-11
      回复
    • 子墨
      子墨
      2018-12-12回复微盟

      😳微信文档有说明一个错误代码是提示一个星期内第三方平台提交审核数量超限制,但没有说明具体数量,按这边观察,一个星期最多也就不到400个,这个限制巨坑,导致我们版本更新需要分批排队,一个星期一批,版本迭代还好,遇到紧急bug就凉凉了;听说微盟主打第三方平台服务的,以为你们会有这跳坑经验,来围观学习一下的😂

      2018-12-12
      回复
  • 倍
    2018-10-16

    2018-10-16
    赞同
    回复
  • 清晗_Tsinghan
    清晗_Tsinghan
    2018-10-11

    插件使用小程序的共用方法(该方法由插件初始化时从构造函数传入),可以通过此方法从小程序发起请求、存储数据等。


    请问下这部分怎么实现呢,,

    2018-10-11
    赞同
    回复 1
    • 微盟
      微盟
      2018-10-16

      下面有一个代码的实例,你可以看看。




      2018-10-16
      回复
登录 后发表内容