更新记录

1.0.4(2026-08-28)

  1. iOS增加获取网络权限的接口

1.0.3(2026-08-27)

  1. 优化iOS

1.0.2(2026-08-11)

  1. 支持iOS
查看更多

平台兼容性

uni-app(3.8.2)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - 5.0 -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(3.8.2)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 - -

其他

多语言 暗黑模式 宽屏模式

UniVPN Client

开发文档

  1. 拷贝demo里的AndroidManifest.xml、nativeResources、Info.plist文件到项目根目录
  2. iOS苹果账号Identifiers里创建iOS项目包名(简称为App项目,例如:com.wrs.project.VPNProject),点击进入详情,在Capabilities里勾选Network Extensions、Personal VPN、App Groups(需要创建一个group,例如:group.com.wrs.project.VPNProject)
  3. iOS苹果账号Identifiers里再创建iOS包名(简称为Extension项目,以包名以项目包名为前缀,例如:com.wrs.project.VPNProject.VPNPacketTunnel),点击进入详情,在Capabilities里勾选Network Extensions、Personal VPN、App Groups(需要创建一个group,跟上面项目的group名要一样,例如:group.com.wrs.project.VPNProject)
  4. 然后分别下载App项目和Extension项目的Profiles签名文件
  5. 将Extension项目的profile文件重命名为ios-comwrsprojectVPNProjectVPNPacketTunnel.mobileprovision,然后替换到nativeResources/ios/ios-comwrsprojectVPNProjectVPNPacketTunnel.mobileprovision
  6. 修改nativeResources/ios/ios-extension.json,将identifier值改为上面Extension项目的包名,将com.apple.security.application-groups值改为上面Extension项目的group名
  7. 修改nativeResources/ios/UniApp.entitlements,将com.apple.security.application-groups值改为上面App项目的group名
  8. 修改Info.plist里UniConnectSDKAppGroupId值改为上面App项目的group名
  9. 如需定制或增加功能请点击插件标题下方的"进入交流群"私聊作者

接口


import {UTSUniVPN} from "@/uni_modules/wrs-uts-univpn"
  • 初始化VPN,一般在启动的时候调用

 let params = {}
// packetTunnelBundleId是Extension项目的包名,仅支持iOS
params["packetTunnelBundleId"] = "com.wrs.project.VPNProject.VPNPacketTunnel"
let suc = UTSUniVPN.vpnInit(params)
if(suc) {
    console.log("初始化成功")
} else {
    console.log("初始化失败")
}
  • 初始化日志

let path = plus.io.convertLocalFileSystemURL("_download")
let flag = UTSUniVPN.logInit({
    path: path,
    loglevel: 3 // 1: error 2:warning 3: info 4: debug
})
if (flag) {
    this.showMsg("日志初始化成功")
} else {
    this.showMsg("日志初始化失败")
}
  • 请求读写权限

let platform = uni.getSystemInfoSync().platform
switch (platform) {
    case "android": {
        let builderVersion = UTSUniVPN.getBuildSDKVersion()
        if (builderVersion >= 30) {
            let flag = UTSUniVPN.isExternalStorageManager()
            if (!flag) {
                UTSUniVPN.toFilesAccessPermissionPage()
            }
        } else if (builderVersion >= 23) {
            this.requestPermission([
                "android.permission.READ_EXTERNAL_STORAGE",
                "android.permission.WRITE_EXTERNAL_STORAGE"
            ])
        }
    }
    break;
    case "ios": {

    }
    break;
    default:
        break;
}
  • 连接服务器
let params = {}
params.serverAddrEntityList = [{
    serverAddress: this.serverAddress,
    port: parseInt(this.port)
}]
params.gmAlgorithm = 0 // //是否支持国密 1: 支持 0:不支持
if (params.gmAlgorithm == 1) {
    params.gmSigCertPath = "/xxx/xxx" // 设置国密证书路径
    params.gmEncCertPath = "/xx/xx" // 设置国密加密证书路径
}
params.routeCover = 0 // //设置是否支持路由覆盖 1: 覆盖 0:不覆盖
params.tunnelMold = 0 // 设置隧道模式, 0为可靠模式 1为快速模式 2为自适应模式
params.tcpbuffersize = 0 /// 设置tcp缓存区
// params.whiteApp = ["om.tencent.mobileqq"] // 设置白名单
let isStartConnect = UTSUniVPN.startConnect(params, (resp) => {
    let opt = resp.opt
    switch (opt) {
        case "onConnectSuccess": {
            // 0-账号密码 1:匿名证书  2:证书挑战  3:证书+账号密码 --必传
            let authMode = resp.authMode
            if (authMode == 0) { // LOGIN_USERNAME_AND_PASSWORD
                this.loginAccountAndPassword()
            } else {
                this.loginAuthMode(authMode)
            }
        }
        break;
        case "onConnectFail": {

        }
        break;
        default:
            break;
    }
})
if (isStartConnect) {
    this.showMsg("连接构建成功")
} else {
    this.showMsg("连接构建失败")
}
  • 登陆

let params = {}
params.cauthType = 0
params.userName = this.userName
params.password = this.password
let flag = UTSUniVPN.startLogin(params, (resp) => {
    let code = resp.code
    switch (code) {
        case 1200: {
            this.showMsg("登陆成功")
        }
        break;
        case 1201: {
            this.showMsg("本地服务器验证失败 响应码:" + code)
        }
        break;
        case 1202: {
            this.showMsg("需要修改密码 响应码:" + code)
        }
        break;
        case 1203: {
            this.showMsg("需要进行双因子验证 响应码:" + code)
        }
        break;
        default: {
            this.showMsg("登陆失败 响应码:" + code)
        }
        break;
    }
})
if (flag) {
    this.showMsg("登陆构建成功")
} else {
    this.showMsg("登陆构建失败")
}
  • 退出登陆
let flag = UTSUniVPN.logout()
if(!flag) {
    this.showMsg("断开连接失败")
}
  • 获取连接状态

let status = UTSUniVPN.getConnectStatus()
if(status == 1) {
    this.showMsg("已连接")
} else if(status == 0) {
    this.showMsg("未连接")
}
  • 获取日志路径

let path = UTSUniVPN.getLogPath()
  • 修改密码

let params = {}
params.originPassword = ""
params.newPassword = ""
params.confirmPassword = ""
UTSUniVPN.modifyPassword(params, (resp)=>{
    let code = resp.code
})
  • 校验simcode

let params = {}
params.simcode = ""
UTSUniVPN.verificationCode(params, (resp)=>{
    let code = resp.code
})
  • 获取网络权限状态,仅支持iOS
let state = UTSUniVPN.getNetworkPermission()
if(state != 2) { // 0: 网络权限未知 1:网络权限被关闭 2:网络已经授权
    this.showMsg("网络权限未知或没有授权 state:" + state)
    return
}

隐私、权限声明

1. 本插件需要申请的系统权限列表:

网络权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: