如何在KMM中使用actual/expect机制实现网络可用性检查
KMM跨平台网络可用性检测(iOS层实现)
完整iOS层实现代码
import platform.Network.NWPathMonitor import platform.Network.NWPathStatus import platform.Network.nwPathMonitorCreate import platform.darwin.dispatch_main_queue actual class NetworkUtils actual constructor() { private val pathMonitor = nwPathMonitorCreate() actual fun isNetworkAvailable(): Boolean { // 获取当前网络状态(同步方式) val currentPath = pathMonitor.currentPath val isConnected = currentPath.status == NWPathStatus.NWPathStatusSatisfied // 若需要持续监听网络变化,可保留以下逻辑并持有pathMonitor实例 /* pathMonitor.setPathUpdateHandler { path -> val newStatus = path.status == NWPathStatus.NWPathStatusSatisfied // 这里可回调通知网络状态变化 } pathMonitor.start(queue = dispatch_main_queue()) */ return isConnected } }
实现说明
- 采用苹果官方推荐的
NWPathMonitor(iOS 12+支持)替代旧版Reachability框架,适配现代iOS系统 NWPathStatusSatisfied枚举值代表当前存在可用网络连接- 如果仅需单次检测网络状态,直接通过
currentPath获取同步结果即可;若需要监听网络状态变化,需将pathMonitor作为类成员持有,在合适时机启动/停止监测,避免重复创建实例浪费资源
完整跨平台代码参考
COMMON层
expect class NetworkUtils() { fun isNetworkAvailable(): Boolean }
ANDROID层
import android.content.Context import android.net.ConnectivityManager import android.app.Application actual class NetworkUtils actual constructor(private val application: Application) { actual fun isNetworkAvailable(): Boolean { val connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork val networkCapabilities = connectivityManager.getNetworkCapabilities(network) return networkCapabilities != null && networkCapabilities.hasCapability(android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET) } }
(注:Android层优化为使用NetworkCapabilities替代已废弃的activeNetworkInfo,适配Android 10+系统)
内容的提问来源于stack exchange,提问作者kumar
相关产品推荐
相关产品推荐

