You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Expo 47.0.0:Android/iOS应用启动时检测VPN连接方法咨询

在React Native Expo 47.0.0中检测VPN连接

Expo Network和NetInfo确实无法直接识别VPN连接,因为它们仅监控基础网络状态而非特殊连接类型。以下是适配Expo 47的Android/iOS启动时检测方案:

Android实现

Android可通过检查网络接口类型或系统网络能力判断VPN:

原生模块方案(适配Managed/Bare Workflow)

  1. 编写Kotlin原生模块:
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build
import expo.modules.kotlin.modules.Module
import expo.modules.kotlin.modules.ModuleDefinition

class VPNDetector : Module() {
    override fun definition() = ModuleDefinition {
        Name("VPNDetector")
        
        Function("isConnected") {
            val cm = context.getSystemService(ConnectivityManager::class.java)
            return@Function if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                val network = cm.activeNetwork ?: false
                val capabilities = cm.getNetworkCapabilities(network) ?: false
                capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ?: false
            } else {
                // 兼容Android 5及以下版本
                val interfaces = android.net.NetworkInterface.getNetworkInterfaces()
                interfaces.asSequence().any { it.name.contains("vpn", ignoreCase = true) }
            }
        }
    }
}
  1. JS层调用:
import { NativeModules } from 'react-native';

async function checkVPNAtLaunch() {
    const isVPNActive = await NativeModules.VPNDetector.isConnected();
    // 根据状态执行逻辑,比如弹窗提示或限制功能
    console.log("VPN状态:", isVPNActive);
}

// 应用启动时触发(可放在App.js的useEffect或componentDidMount中)
checkVPNAtLaunch();

iOS实现

iOS需借助NEVPNManager获取VPN连接状态,同时需添加权限声明:

原生模块方案

  1. 编写Swift原生模块:
import ExpoModulesCore
import NetworkExtension

class VPNDetector: Module {
    func definition() -> ModuleDefinition {
        Name("VPNDetector")
        
        Function("isConnected") {
            let vpnManager = NEVPNManager.shared()
            return vpnManager.connection.status == .connected || vpnManager.connection.status == .connecting
        }
    }
}
  1. 在Info.plist中添加权限描述:
<key>NSVPNUsageDescription</key>
<string>检测VPN连接以优化服务体验</string>
  1. JS层调用同Android。

Expo Managed Workflow简化建议

若不想编写原生代码,可通过expo prebuild将项目转为Bare Workflow,然后安装第三方库react-native-vpn-detector(需确认版本适配Expo 47),直接调用库中方法实现检测。

内容的提问来源于stack exchange,提问作者Abdullah Zafar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:43:17