diff --git a/packages/uni-app-plus/src/service/api/device/network.ts b/packages/uni-app-plus/src/service/api/device/network.ts new file mode 100644 index 0000000000000000000000000000000000000000..4681a75ef558136c2b8ccea73c6dd8e1a0cbba68 --- /dev/null +++ b/packages/uni-app-plus/src/service/api/device/network.ts @@ -0,0 +1,41 @@ +import { NETWORK_TYPES } from '../constants' +import { defineOnApi, defineOffApi, defineAsyncApi } from '@dcloudio/uni-api' + +type OnNetworkStatusChange = typeof uni.onNetworkStatusChange + +const API_ON_NETWORK_STATUS_CHANGE = 'onNetworkStatusChange' + +function networkListener() { + getNetworkType().then(({ networkType }) => { + UniServiceJSBridge.invokeOnCallback( + API_ON_NETWORK_STATUS_CHANGE, + { + isConnected: networkType !== 'none', + networkType, + } + ) + }) +} + +// 注意:框架对on类的API已做了统一的前置处理(仅首次调用on方法时,会调用具体的平台on实现,后续调用,框架不会再调用,实现时,直接监听平台事件即可) +export const onNetworkStatusChange = defineOnApi( + API_ON_NETWORK_STATUS_CHANGE, + () => { + ;(plus as any).globalEvent.addEventListener('netchange', networkListener) + } +) +// 注意:框架对off类的API已做了统一的前置处理(仅当框架内不存在对应的on监听时,会调用具体的平台off实现,若还存在事件,框架不会再调用,具体实现时,直接移除平台事件即可) +export const offNetworkStatusChange = defineOffApi< + typeof uni.offNetworkStatusChange +>('offNetworkStatusChange', () => { + ;(plus as any).globalEvent.removeEventListener('netchange', networkListener) +}) + +export const getNetworkType = defineAsyncApi( + 'getNetworkType', + (_args, { resolve }) => { + let networkType = + NETWORK_TYPES[plus.networkinfo.getCurrentType()] || 'unknown' + return resolve({ networkType }) + } +) diff --git a/packages/uni-app-plus/src/service/api/index.ts b/packages/uni-app-plus/src/service/api/index.ts index 91edd3200f62ab86b3cfaa68c4e8c9bf61047401..2156c1c9048a2c78d7332563ae2f9382c0c9baec 100644 --- a/packages/uni-app-plus/src/service/api/index.ts +++ b/packages/uni-app-plus/src/service/api/index.ts @@ -9,6 +9,7 @@ export * from './device/bluetooth' export * from './device/ibeacon' export * from './device/makePhoneCall' export * from './device/clipboard' +export * from './device/network' export * from './media/getImageInfo' export * from './media/getVideoInfo'