微信小程序开发中遇到的坑和解决办法

一、原生组件的层级问题

video、canvas、camera原生组件层级最高,其余组件不管z-index为多少,都没法覆盖在原生组件上。css

这里拿video组件作示例,若是须要点击视频支持微信开放能力,例如受权手机号,获取用户信息等,必需要利用button组件,若是在原生组件外层添加button组件,点击视频并不会触发button事件,代码以下,这里点击视频并不会弹出受权手机提示,触发getPhoneInfo函数。html

<button open-type='getPhoneNumber' bindgetphonenumber='getPhoneInfo'>
    <video src="{{videoUrl}}"></video>
</button>

解决办法:利用 cover-view 组件,原生组件只支持嵌套cover-viewcover-image组件,且cover-view内可使用button
代码以下,同时用css隐藏button,并全覆盖video便可实现点击视频弹出受权手机提示,此时点击控制栏无效。这里视频是自动播放不可控,若是须要控制视频或者是自定义播放按钮图标等,能够在button内嵌套cover-image自定义便可。android

<video src="{{videoUrl}}" autoplay controls="{{false}}">
    <cover-view>
        <button open-type='getPhoneNumber' bindgetphonenumber='getPhoneInfo'>
            <cover-image src="{{imgUrl}}" />
        </button>
    </cover-view>
</video>

tipsvideo的层级问题在开发者工具中不会显露出来,z-index会起做用,必定要在真机上测试。ios

二、ios和android部分组件表现的差别

ios

video微信最小化后正在播放的video会暂停,须要再次点击播放按钮,若是视频设置的是不可控,没有开始播放按钮,视频暂停了就没法继续播放了,android没有该问题。web

<video id="video" src="{{videoUrl}}" loop autoplay controls="{{false}}">
</video>

解决办法:建立video上下文VideoContext 对象,页面每次onShow的时候执行相应操做。canvas

onReady: function () {
    this.videoContext = wx.createVideoContext('video')
},

onShow: function () {
    if (this.videoContext) {
        this.videoContext.play()
    }
},

android

input限制了输入的最大长度,达到最大长度后再次输入是没有显示的,可是inputvalue值包含最大长度后面的输入。小程序

<input bindinput='phoneChange' maxlength="4" type="number" />
phoneChange: function(e){
    console.log('e.detail.value) 
    //小键盘输入12345,实际获取到的ios的值为1234,android是12345,input组件显示的是1234
}

三、登陆以后的session_key失效

冷启动进入小程序,app.jsonLaunch调用登陆接口,经过登陆code,后端拿到session_key以后,后续可解密encryptedDatagetPhoneNumbergetUserInfo),校验用户信息signature(getUserInfo),若是后续用户一直是热启动进入小程序,不会在onLaunch中从新登陆,同时用户没有在小程序有过操做从而延长session_key的有效期,后续操做就会出现session_key失效,报错。后端

解决办法:onShow中调用登陆接口,同时为了不不必的调用,可经过wx.checkSession( )检查登陆状态是否过时,若是过时就从新登陆,代码以下。api

onShow: function () {
    wx.checkSession({
        success: () => {
            wx.login({
                success: res => {
                    if (res.code) 
                        wx.request({  // 换取openid,session_key等信息
                            url: 'https://test.com/onLogin',
                            data: {
                                code: res.code
                            },
                        })
                    }
                },
            })
        },
    })
},

四、预览文档问题

两种方法微信

1 web-view组件

在微信后台设置好域名后直接调用

<web-view src="{{url}}"></web-view>

如图所示:

图片描述

可是android会下载该文件,这并非用户想看到的,也能够考虑用如下方法。

2 wx.openDocument( )

wx.downloadFile({
    url: 'http://example.com/somefile.pdf',
    success: function(res) {
        const filePath = res.tempFilePath
        wx.openDocument({
            filePath: filePath,
            success: function(res) {
                console.log('打开文档成功')
            }
        })
    }
})

效果图以下:

图片描述

对比两个方法的效果图,能够看到方法2是跳出了小程序的,没法使用小程序提供的功能菜单了。

相关文章
相关标签/搜索