更新记录
1.0.4(2026-08-28)
- iOS增加获取网络权限的接口
1.0.3(2026-08-27)
- 优化iOS
1.0.2(2026-08-11)
- 支持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
开发文档
- 拷贝demo里的AndroidManifest.xml、nativeResources、Info.plist文件到项目根目录
- iOS苹果账号Identifiers里创建iOS项目包名(简称为App项目,例如:com.wrs.project.VPNProject),点击进入详情,在Capabilities里勾选Network Extensions、Personal VPN、App Groups(需要创建一个group,例如:group.com.wrs.project.VPNProject)
- iOS苹果账号Identifiers里再创建iOS包名(简称为Extension项目,以包名以项目包名为前缀,例如:com.wrs.project.VPNProject.VPNPacketTunnel),点击进入详情,在Capabilities里勾选Network Extensions、Personal VPN、App Groups(需要创建一个group,跟上面项目的group名要一样,例如:group.com.wrs.project.VPNProject)
- 然后分别下载App项目和Extension项目的Profiles签名文件
- 将Extension项目的profile文件重命名为ios-comwrsprojectVPNProjectVPNPacketTunnel.mobileprovision,然后替换到nativeResources/ios/ios-comwrsprojectVPNProjectVPNPacketTunnel.mobileprovision
- 修改nativeResources/ios/ios-extension.json,将identifier值改为上面Extension项目的包名,将com.apple.security.application-groups值改为上面Extension项目的group名
- 修改nativeResources/ios/UniApp.entitlements,将com.apple.security.application-groups值改为上面App项目的group名
- 修改Info.plist里UniConnectSDKAppGroupId值改为上面App项目的group名
- 如需定制或增加功能请点击插件标题下方的"进入交流群"私聊作者
接口
import {UTSUniVPN} from "@/uni_modules/wrs-uts-univpn"
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
})
let params = {}
params.simcode = ""
UTSUniVPN.verificationCode(params, (resp)=>{
let code = resp.code
})
let state = UTSUniVPN.getNetworkPermission()
if(state != 2) { // 0: 网络权限未知 1:网络权限被关闭 2:网络已经授权
this.showMsg("网络权限未知或没有授权 state:" + state)
return
}