这周领导突然说为了不泄密及版权等问题,要求在小程序的某个页面里禁止用户进行录屏截图。 之前还没做过这种功能,听到这句话,内心第一句话就是哥哥做不到啊!
开完会后,赶紧打开微信小程序的文档查看了起来,好在文档有专门的api
这边就来介绍一下吧。
小程序禁止录屏的api是区分ios和安卓的
先来介绍一下ios的实现方法
`
# wx.getScreenRecordingState(Object object) ios查询用户是否在录屏 其实还有两个相关的api有兴趣大家可以去看看
大概就是在onshow的生命周期调用一个方法,方法内是搞个定时器不断了检测是否有在录屏,如果有在录屏的话则弹窗提醒并强制用户跳转到非录屏页面
this.timer = setInterval(() => {
wx.getScreenRecordingState({
success: function(res) {
if (res.state == "on") { uni.showModal({
content: "此页面不允许录屏!",
showCancel: false,
success: function(res) {
if (res.confirm) {
uni.switchTab({
url: "/pages/index/index"
})
}
}
})
}
}
})
}, 2000)
这里还要记得在onhide和onUnload的生命周期里清除一下这个定时器
` 然后就是安卓的实现方式
//禁止安卓机截屏
#wx.setVisualEffectOnCapture(Object object) 设置截屏/录屏时屏幕表现,仅支持在 Android 端调用
if(wx.setVisualEffectOnCapture){
wx.setVisualEffectOnCapture({
visualEffect: 'hidden',
success:(res) => {
console.log('success回调',res)
},
})
}
当然这个记得也要在onhide和onUnload的生命周期里恢复可以截屏,不然其他的页面可能无法截屏
if(wx.setVisualEffectOnCapture){
wx.setVisualEffectOnCapture({
visualEffect: 'none',
success:(res) => {
console.log('success回调',res)
},
})
}
当时做到这里以为就可以禁止录屏了,但是测试的时候才发现这个只是禁止截屏而已,录屏功能还是可以正常使用。好家伙,我又去看了一遍文档没问题啊,后来又查了一下看看是怎么回事。结果发现查到的都是这样实现的,没有说其他方式。这里我不得不怀疑那些人是真的有实践使用过他们写的东西吗?
后面我又去看了一下别人安卓禁止录屏的方式,发现是安卓是可以录屏的,但他们录到的都是黑屏加声音这样。
不服气的我(被逼无奈)又去翻看了一下小程序的文档,偶然发现一个页面配置visualEffectInBackground,我们可以在pages.json这个文件里在需要禁止录屏的页面那里配置visualEffectInBackground:hidden。这样就可以实现在这个页面录屏只能录到黑屏了。