微信小程序弱网监控

前言

在真实的项目中,我们为了良好的用户体验,会根据用户当前的网络状态提供最优的资源,例如图片或视频等比较大的资源,当网络较差时,可以提供分辨率更低的资源,能够让用户尽可能快的看到有效信息,而不是一直白屏等待。

那如何设计一个生产环境可用的小程序当前网络状态监测系统。主要考虑以下几个方面:

  • 首先我们可以粗略的用getNetworkType来获取当前的网络连接类型,当获取到2g或3g等类型时,可以判定当前处于弱网状态。
  • 当处于4g,5g或wifi下,我们的网络也是会有波动的,这个时候就需要我们根据真实的网络下载情况来判断网络状态,
  • 当判断处于弱网时,这个时候我们要持续的来获取当前网络状况,当网络状况好转或设置一个最长检测的时间,当规定时间内,网络依然没有好转,则停止获取网络状况。
  • 通过全局的eventBus系统,将网络状态发射出去,供业务功能处使用。

实现

细节步骤

  • 划定网络的判定标准,也就是什么情况处于弱网,什么时候处于好的网络。

    • 网络类型上2g和3g直接判定为弱网
    • 通过真实请求一张图片,来实际获取当前的网络请求状况,可以有两种方式:
      • 一种是通过耗时,这里选择一个阈值范围1000, 1500,低于1000的为极好网,中间的为好网,超过1500则为
      • 一种是通过,request/download接口回调中提供的profile信息,其中throughputKbps表示当前网络的实际下载kbps。
  • 判断弱网后的处理。判断弱网后,我们不能就直接让我们的资源加载都处于一种弱网的情况,而是判断弱网后,我们要递归的去持续判断网络状态,直至网络状况好转,或有一个最大的重试次数,很长一段时间网络状态都不好,就不用在尝试去判断了,用户也不可能一直在这等待网络好转。

  • 持续监控。也就是判断网络的时机:

    • 一种是监听网络类型的切换,通过wx.onNetworkStatusChange。网络类型切换时,进行网络判断
    • 每一次接口请求的时候,都进行一次网络状态判断,因此,这里我们要封装一个自己的request方法,将通用的逻辑都封装在一处。

代码展示

js

// import eventBus from './eventBus';
const NETWORK_STATUS = {
    OFFLINE: 'offline',
    POOR: 'poor',
    GOOD: 'good',
    WONDERFUL: 'wonderful'
}
// 小于1000表示网络极好,1000至1500则表示good 超过1500表明是弱网。
const DOWNLOAD_TIME = [1000, 1500];
const MAX_COUNT = 10;
let count = 0;
function getNetworkType() {
    return new Promise((resolve) => {
        wx.getNetworkType({
            success(res) {
                resolve(res);
            },
            fail(err) {
                resolve(err);
            }
        })
    })
}
const getNetworkStatus =  (opt) => {
    return new Promise((resolve) => {
        try {
            let networkType = opt && opt.networkType;
            let networkStatus = NETWORK_STATUS.WONDERFUL;
            if (!networkType) {
                networkType = getNetworkType().then(({networkType}) => {
                    if (['unknown', 'none'].includes(networkType)) {
                        emitNetworkStatus(NETWORK_STATUS.OFFLINE);
                        return resolve(NETWORK_STATUS.OFFLINE);
                    }
                    if (['2g', '3g'].includes(networkType)) {
                        emitNetworkStatus(NETWORK_STATUS.POOR);
                        return resolve(NETWORK_STATUS);
                    }
                    const startTime = +new Date();
                    requestImage().then((result) => {
                        const requestTime = +new Date() - startTime;
                        
                        if (requestTime < DOWNLOAD_TIME[0]) {
                            networkStatus = NETWORK_STATUS.WONDERFUL;
                        } else if (requestTime > DOWNLOAD_TIME[1]) {
                            networkStatus = NETWORK_STATUS.POOR;
                        } else {
                            networkStatus = NETWORK_STATUS.GOOD;
                        }
                        emitNetworkStatus(networkStatus);
                        return resolve(networkStatus);
                    })
                   
                });
            }
        } catch (error) {
            resolve(NETWORK_STATUS.WONDERFUL);
        }
    })
   
}

function run() {
    if (count >= MAX_COUNT) {
        return;
    }
    const timer = setTimeout( () => {
        getNetworkStatus().then(networkStatus => {
            count += 1;
            if ([NETWORK_STATUS.POOR, NETWORK_STATUS.GOOD].includes(networkStatus)){
                run();
            }
        })
        clearTimeout(timer);
    }, 5000)
}
function start(opt) {
    const timer = setTimeout( () => {
        getNetworkStatus(opt).then(networkStatus => {
            if ([NETWORK_STATUS.POOR, NETWORK_STATUS.GOOD].includes(networkStatus)) {
                run();
            }
        })
        
        clearTimeout(timer);
    }, 1000)
}
function requestImage() {
    return new Promise((resolve) => {
        wx.request({
            url: 'https://dss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/-146383143_-1016538910_80_80.png',
            data: {
                time: +new Date(),
            },
            success(res) {
                resolve(res);
            },
            fail() {
                resolve()
            }
        })
    })
}
function emitNetworkStatus(networkStatus) {
    const app = getApp();
    const oldNetwordStatus  = app.globalData.networkStatus;
    // 只有本次状态与上一次存储的不一致才会对外发送。
    if (oldNetwordStatus !== networkStatus) {
        app.globalData.networkStatus = networkStatus;
        // 通过全局的事件系统,将结果发送出去
        // eventBus.emit('networkChange', networkStatus, oldNetwordStatus);    
    }
}

export const networkController = {
    start,
};

eventBus功能可以根据自己的项目自行封装,这里不再多述。

调用时机

  • app.js中的onLaunch钩子中,监听wx.onNetworkStatusChange。在其中调用我们的方法

js

 wx.onNetworkStatusChange((res) => {
      networkController.start(res);
    })
  • 另一种就是在我们封装的request函数内,每次请求接口时调用一次。这样能够保证我们可以不那么频繁但有效的去判断是否去判断当前网络状态

总结

作为一个c端产品,针对弱网的优化是必不可少的。用户体验问题要一直放在最重要的位置,作为开发人员要时刻关注这些点,以免给用户造成不好的体验。

如果有更好的意见,辛苦评论区指出,共同学习,共同提高。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OneNet 微信小程序是由中国移动推出的一款用于物联网应用开发的工具。它基于微信小程序的开发框架,结合了中国移动的物联网平台 OneNet,提供了丰富的物联网功能和接口。 OneNet 微信小程序可以实现设备接入和控制、数据采集和展示、消息推送等一系列物联网应用的开发。与传统的物联网应用开发相比,OneNet 微信小程序具有以下几个优势: 首先,OneNet 微信小程序的开发门槛较低,使用的是微信小程序的开发框架,开发者可以使用熟悉的前端开发技术进行开发。同时,OneNet 提供了丰富的开发文档和示例,为开发者提供了便捷的开发环境。 其次,OneNet 微信小程序与微信生态系统的无缝对接,可以直接通过微信小程序实现设备的远程控制和数据采集。用户只需要在微信小程序中注册设备并进行绑定,即可通过手机随时随地对设备进行控制和监测。 再次,OneNet 微信小程序支持多种数据展示方式,包括图表、列表和地图等,用户可以根据实际需要选择最合适的展示形式。同时,OneNet 提供了数据分析和报表功能,可以对设备的历史数据进行分析和展示,帮助用户更好地了解设备的运行状态和趋势。 总而言之,OneNet 微信小程序是一款功能强大且易于开发的物联网应用开发工具,为开发者和用户提供了便捷的物联网应用开发和使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值