更新记录

0.2.2(2023-01-21)

更新深信服iOS SDK,解决无法添加到系统VPN列表问题,可能出现的连接成功但是无法访问部分地址问题

0.2.1(2022-08-08)

修复iOS打包失败的问题

查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:5.0 - 11.0 armeabi-v7a:支持,arm64-v8a:未测试,x86:未测试 适用版本区间:9 - 15

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


深信服-UniApp接入插件使用说明

  • 本插件使用深信服双域sdk

  • 支持Android及iOS

  • 支持用户名密码登录,登出,获取认证状态,获取隧道状态

编写配置文件

配置文件放置目录:www/static/sangfor-confg.json 配置文件为json格式,示例如下:(android 和 ios分别配置)

{
    "android": {
        "sdkMode": "MODE_VPN",
        "sdkFlags": [8,4],
        "timeout": 30
    },
    "ios" :{
        "sdkMode": "MODE_VPN",
        "sdkFlags": [8],
        "timeout": 30
    }
}
  • sdkMode: VPN 模式(请参考深信服官方文档)

    MODE_VPN
    MODE_SANDBOX
    MODE_VPN_SANDBOX
  • sdkFlags: SDK标识整型数组(flag必须只要有一个4或者8,详情请参考深信服官方文档)

    //初始化值
    FLAGS_NONE = 1; 
    //设置VPN为TCP模式
    FLAGS_VPN_MODE_TCP = 2;
    //设置VPN为L3VPN模式
    FLAGS_VPN_MODE_L3VPN = 4;
    //设置SDK为主应用模式
    FLAGS_HOST_APPLICATION = 8;
    //设置SDK为子应用模式
    FLAGS_SUB_APPLICATION = 16;
    //启用文件隔离
    FLAGS_ENABLE_FILE_ISOLATION = 32;
    //SDK支持外部(第三方)更新策略
    FLAGS_SUPPORT_MANAGE_POLICY = 64;     
  • timeout: 超时时间设置,单位 秒

接口说明

所有接口返回数据格式示例如下:

{
    "code": 0,
    "msg": {
        // 不同接口不同
    }
}

其中code为0时表示接口调用成功,-1 标识调用失败,深信服的状态则在msg中返回,不同接口返回不同;

获取插件对象

const sangforVpn = uni.requireNativePlugin('GeoStar-SangforVPN-New');

登录

loginVPN(){
    const vpn_address='https://xxx.xxx.xxx.xxx';
    const username='xxx';
    const password='xxxxxx';
    sangforVpn.login({vpn_address,username,password},
    function(result){
        uni.showModal({title:"loginVPN-Success",content:JSON.stringify(result)});   
    },function(result){
        uni.showModal({title:"loginVPN-Failed",content:JSON.stringify(result)});    
    },function(result){
        uni.showModal({title:"loginVPN-Progress",content:JSON.stringify(result)});  
    })
},

登录的反馈码参考:深信服文档-SDK错误码与描述

注意:登录过程中可能会有二次认证的要求,目前虽有提供对应接口,但并未测试通过,请知悉!!!

响应msg说明

获取状态的msg格式为:

{
    "errorCode": 状态码-整型数字 , // 参考下方errorCode说明
    "errStr": 状态信息 ,
    "serverInfo" 服务信息,
    "authType": 整型 , // 仅Progress回调中有,可取值参考下方 SFAuthType的说明
}

errorCode参考

/// 错误码
typedef NS_ENUM(NSInteger, SF_ERROR_CODE)
{
    /** 成功的标记 */
    SF_ERROR_CODE_NONE                        = 1000,       //成功

    /** 认证服务端返回的错误  */
    SF_ERROR_SERVER_BUSY                      = 1001,       //操作失败,可能服务器太忙
    SF_ERROR_TIME_DENY                        = 1002,       //非允许时间段,禁止登录
    SF_ERROR_AUTH_TYPE_DISABLE                = 1003,       //未启用此认证,访问被拒绝
    SF_ERROR_NOT_SAME_USER                    = 1004,       //登录失败,前一认证与当前认证非同一用户
    SF_ERROR_AUTH_COMBINATION_INVALID         = 1005,       //不支持此种认证组合方式
    SF_ERROR_LICENSED_USER_LIMIT              = 1006,       //系统已到达最大授权用户限制
    SF_ERROR_GROUP_USER_LIMIT                 = 1007,       //您所在用户组已达到最大在线用户限制
    SF_ERROR_ACCOUNT_LOCKED                   = 1008,       //用户尝试暴破登录,已被系统锁定
    SF_ERROR_IP_LOCKED                        = 1009,       //ip地址尝试暴破登录,已被系统锁定
    SF_ERROR_IP_NEED_WORD_VERIFICATION        = 1010,       //ip地址尝试暴破登录,启用图形校验码
    SF_ERROR_SESSION_TIMEOUT                  = 1011,       //session timeout

    /**用户名认证*/
    SF_ERROR_PASSWOR_INVALID                  = 1101,        //用户名或者密码错误
    SF_ERROR_USER_EXPIRE                      = 1102,        //用户已过期
    SF_ERROR_USER_DISABLE                     = 1103,        //用户被禁用
    SF_ERROR_USER_TIMEOUT                     = 1104,        //用户已超时或注销
    SF_ERROR_CHARACTERS_INCORRECT             = 1105,        //校验码错误或校验码已过期
    SF_ERROR_USER_NEED_WORD_VERIFICATION      = 1106,        //用户名或密码错误,启用图形校验码
    SF_ERROR_LDAP_SERVER_FAILED               = 1107,        //LDAP连接服务器失败
    /**证书认证*/
    SF_ERROR_CERTIFICATE_INVALID              = 1201,        //证书不合法
    SF_ERROR_CERTIFICATE_AUTH_DISABLE         = 1202,        //证书认证被禁用
    SF_ERROR_CERTIFICATE_REVOKED              = 1203,        //证书已经被撤消
    SF_ERROR_CERTIFICATE_CODE_ERR             = 1204,        //证书编码设置有误,请联系管理员
    SF_ERROR_CERTIFICATE_SIGN_INVALID         = 1205,        //证书签名无效
    SF_ERROR_CERTIFICATE_NOT_EFFECT           = 1206,        //证书还未生效
    SF_ERROR_CERTIFICATE_EXPIRE               = 1207,        //证书已经过期
    SF_ERROR_CERTIFICATE_NO_PERMISSION        = 1208,        //证书读取失败,请检查证书文件权限

    /**免密认证*/
    SF_ERROR_TICKET_MOBID_INVALID             = 1301,        //免密认证无效的手机ID
    SF_ERROR_TICKET_CODEID_INVALID            = 1302,        //免密认证无效的code
    SF_ERROR_TICKET_PASS_CLOSE                = 1303,        //免密认证功能未开启
    SF_ERROR_TICKET_UNKOWN                    = 1304,        //未知错误

    /**短信校验码认证*/
    SF_ERROR_SEND_SMS_MESSAGE                 = 1401,        //发送短信失败
    SF_ERROR_SMS_PASSWORD_INVALID             = 1402,        //短信验证码错误
    SF_ERROR_NOT_SET_PHONE_NUMBER             = 1403,        //用户未设置手机号码,无法进行短信认证
    SF_ERROR_PHONE_NUMBER_INCORRECT           = 1404,        //提交的手机号码错误,无法进行短信认证
    SF_ERROR_SMS_PASSWORD_EXPIRE              = 1405,        //短信验证码已过期

    /**EMM授权认证*/
    SF_ERROR_EMM_NOT_AUTHORZATION             = 1501,        //EMM授权不通过,请联系管理员更新授权
    SF_ERROR_EMM_DEVICE_LIMIT                 = 1502,        //EMM授权达到最大数
    SF_ERROR_EMM_DEVICE_FROZEN                = 1503,        //EMM授权被冻结
    SF_ERROR_EMM_FAILED                       = 1504,        //EMM授权认证失败
    SF_ERROR_EMM_NETWORK_ERROR                = 1505,        //EMM授权网络链接错误
    SF_ERROR_EMM_CRYPTO_KEY                   = 1506,        //EMM授权加密key错误

    /**硬件特征码认证*/
    SF_ERROR_HID_VERIFY_FAILED                = 1601,        //硬件特征码验证失败
    SF_ERROR_HID_EXIST_NOTPASSED              = 1602,        //存在未审批的硬件特征码,等待管理员审批
    SF_ERROR_HID_INVALID                      = 1603,        //用户超时或硬件特征码无效输入
    SF_ERROR_HID_LIMIT                        = 1604,        //硬件特征数达到最大值
    SF_ERROR_HID_UPDATE_FAILED                = 1605,        //更新硬件特征码失败
    SF_ERROR_HID_GROUP_LIMIT                  = 1606,        //硬件特征码达到组用户最大限制
    SF_ERROR_HID_SN_LIMIT                     = 1607,        //硬件特征码达到授权限制
    SF_ERROR_HID_FAILED                       = 1608,        //当前终端未经过硬件特征码验证,请等待管理员审批
    SF_ERROR_HID_SUBMIT_FAILED                = 1609,        //提交硬件特征码失败
    SF_ERRPR_HID_CELLNUM_INVALID              = 1610,        //硬件特征码短信审批,用户未设置手机号码
    SF_ERROR_HID_COLLECT_FAILED               = 1611,        //硬件特征码收集失败

    /**外部认证等*/
    SF_ERROR_NO_EXTERNAL_SERVER               = 1701,        //没有对应的外部认证服务器,认证失败
    SF_ERROR_TOKEN_PASSWORD_INCORRECT         = 1702,        //动态令牌密码错误,认证失败
    SF_ERROR_CHALLENGE_FAILED                 = 1703,        //挑战认证失败
    SF_ERROR_CHALLENGE_TIMEOUT                = 1704,        //radius挑战超时

    /** 本地认证的错误 */
    SF_ERROR_CONNECT_VPN_FAILED               = 2001,        //连接VPN服务器错误,请检查网络
    SF_ERROR_URL_INVALID                      = 2002,        //VPN的URL为空
    SF_ERROR_DOMAN_RESOLVE_FAILED             = 2003,        //域名解析失败
    SF_ERROR_CRACKED_PHONE                    = 2004,        //越狱手机禁止登陆
    SF_ERROR_SELECT_LINE_FAILED               = 2005,        //VPN选路失败
    SF_ERROR_NET_INVALID                      = 2006,        //网络不可用
    SF_ERROR_ADDRESS_FORMAT                   = 2007,        //vpn地址格式有误
    SF_ERROR_CONN_TIMEOUT                     = 2008,        //连接服务器超时

    SF_ERROR_AUTH_PARAM_EMPTY                 = 2101,        //认证参数为空
    SF_ERROR_AUTH_TYPE_INVALID                = 2102,        //调用的方法与当前认证方式不一致
    SF_ERROR_CERTIFICATE_NOT_EXIST            = 2103,        //证书不存在
    SF_ERROR_CERTIFICATE_TYPE_ERROR           = 2104,        //证书类型获取失败
    SF_ERROR_TICKET_AUTH_DISABLE              = 2105,        //免密认证不可用
    SF_ERROR_BUILD_REQUEST                    = 2106,        //构建请求失败
    SF_ERROR_SESSION_INVALID                  = 2107,        //session无效
    SF_ERROR_AUTH_TYPE_UNSPPORT               = 2108,        //认证类型不支持
    SF_ERROR_STATUS_ERROR                     = 2109,        //登录VPN状态错误,注销后再进行登录
    SF_ERROR_HID_GET_ERROR                    = 2110,        //读取硬件特征码失败
    SF_ERROR_AUTH_INIT_ERROR                  = 2111,        //VPN初始化失败
    SF_ERROR_AUTH_PARAM_ERROR                 = 2112,        //认证参数错误
    SF_ERROR_CERTIFICATE_WRONG_PWD            = 2113,

    SF_ERROR_START_L3VPN_FAILED               = 2201,        //启动L3VPN失败

    /** 非认证产生的错误 */
    SF_ERROR_CHPWD_TIMEOUT                    = 3001,        //用户超时
    SF_ERROR_CHPWD_NO_PERMISSION              = 3002,        //不属于本地密码认证用户
    SF_ERROR_CHPWD_GETINFO_FAIL               = 3003,        //获取用户信息失败
    SF_ERROR_CHPWD_WRONG_PWD                  = 3004,        //密码输入错误
    SF_ERROR_CHPWD_SYSTEM_BUSY                = 3005,        //更新用户信息失败,可能服务器忙!
    SF_ERROR_CHPWD_FORBID_CHGPWD              = 3006,        //您的帐号没有通过密码认证,不能修改密码
    SF_ERROR_VPN_NOT_LOGIN                    = 3007,        //VPN未登录导致修改密码失败
    SF_ERROR_NEW_PASSWORD_SAME_AS_OLD         = 3008,        //新密码与原密码相同
    SF_ERROR_CHPWD_SAFE_POLICY                = 3009,        //不符合密码策略
    SF_ERROR_CHPWD_FAILED                     = 3010,       //修改密码失败
    SF_ERROR_CHPWD_RIGHT_CHGPWD               = 3013,        //对不起,您不具有更改密码的权限,请与管理员联系
    SF_ERROR_CHPWD_RIGHT_CHGNOTE              = 3014,        //对不起,您不具有更改用户描述的权限,请与管理员联系
    SF_ERROR_CHPWD_NEWPWD_TOO_LONG            = 3015,        //密码的长度最长不能超过48个字符
    SF_ERROR_UPLAOD_DEVICE_INFO_FAILED        = 3016,        //上报设备信息失败
    SF_ERROR_IPV6_TO_TPV4_ONLY                = 3017,        //本地是纯ipv6场景不能对接ipv4的服务端
    SF_ERROR_IPV4_TO_TPV6_ONLY                = 3018,        //本地是纯ipv4场景不能对接ipv6的服务端

    SF_ERROR_FORWARD_FAILED                   = 3101,        //转发线程启动失败
    SF_ERROR_OUT_OF_MEMORY                    = 3201,        //内存不足

    /** 其它错误 */
    SF_ERROR_OTHER_ERROR                      = 4001,        //其它错误

    /** 注销错误 **/
    SF_ERROR_IP                             = 5001,         //ip错误注销
    SF_ERROR_IP_CONFLIC                     = 5005,         //虚拟ip冲突
    SF_ERROR_IP_SHORTAGE                    = 5006,         //虚拟ip短缺
    SF_ERROR_IP_KICK                        = 5007,         //虚拟ip被高权限用户踢掉
    SF_ERROR_IP_OTHER                       = 5008,         //虚拟ip其他错误
    SF_ERROR_IP_QUIT                        = 5009,         //服务端命令客户端退出
    SF_ERROR_IP_RECV                        = 5010,         //接收到服务端下发的ip
    SF_ERROR_IP_RESET                       = 5011,         //ip服务服务端重置了
    SF_ERROR_IP_RECONNECT                   = 5012,         //ip服务读、写隧道重连成功
} ;

SFAuthType 说明

/// 定义支持的认证类型
typedef NS_ENUM(NSInteger, SFAuthType)
{
    SFAuthTypeCertificate       = 0,         //证书认证
    SFAuthTypePassword          = 1,         //用户名密码认证
    SFAuthTypeSMS               = 2,         //短信认证
    SFAuthTypeHardId            = 4,         //硬件特征码认证, 内部认证
    SFAuthTypeRadius            = 6,         //挑战认证或者Radius认证
    SFAuthTypeToken             = 7,         //令牌认证
    SFAuthTypeAuthor            = 10,        //授权认证,  内部认证
    SFAuthTypeCode              = 11,        //钉钉code认证 无
    SFAuthTypeSession           = 16,        //Session认证 无
    SFAuthTypeNone              = 17,        //无认证
    SFAuthTypeRenewPassword     = 18,        //强制修改密码认证
    SFAuthTypeRenewPassword2    = 20,        //强制修改密码认证,处理之前没有输入密码的情况。 不支持
    SFAuthTypeRand              = 22,        //图形校验码认证
    SFAuthTypeTicket            =  1<<11,     //Ticket认证
    SFAuthTypeUnknow            = -1,        //未知认证类型
} ;

登出

示例代码

logoutVPN(){
    sangforVpn.logout(function(result){
        uni.showModal({title:"logoutVPN",content:JSON.stringify(result)});})
},

msg格式

同登录

获取认证状态

示例代码

getAuthStatus(){
    let authStatus = sangforVpn.getAuthStatus();
    console.log(authStatus)
    uni.showModal({title:"getAuthStatus",content:JSON.stringify(authStatus)});
},

msg格式

获取认证状态直接返回,没有回调,返回值中的msg段格式如下:

{
    "authStatus": 整型值 // 参考下方认证状态说明
}

认证状态说明

/// 认证状态
typedef NS_ENUM(NSInteger, SFAuthStatus)
{
    SFAuthStatusNone         = 0,      //未认证
    SFAuthStatusLogining     = 1,      //正在认证
    SFAuthStatusPrimaryAuthOK= 2,      //主认证成功
    SFAuthStatusAuthOk       = 3,      //认证成功
    SFAuthStatusLogouting    = 4,      //正在注销
    SFAuthStatusLogouted     = 5,      //已经注销
} ;

获取隧道状态

示例代码

queryTunnelStatus(){
    let _this = this;
    sangforVpn.queryTunnelStatus(function(ret){
        uni.showModal({title:"queryTunnelStatus",content:JSON.stringify(ret)});
    })
}

msg格式

{
    "tunnelStatus": 整型值 // 参考下方隧道状态说明
}

隧道状态值说明

/// VPN隧道状态
typedef NS_ENUM(NSInteger, SFTunnelStatus)
{
    SFTunnelStatusInit             = 0,        //VPN隧道初始化
    SFTunnelStatusOnline           = 1,        //VPN隧道在线
    SFTunnelStatusReconnecting     = 2,        //VPN隧道正在连接
    SFTunnelStatusOffline          = 3,        //VPN隧道离线
    SFTunnelStatusExit             = 4,        //VPN隧道退出
    SFTunnelStatusExtionError      = 100,      //VPN隧道插件出错
} ;

获取图片随机验证码

图片验证码为base64字符串,从返回的 codeBase64 中取出,需要手动加上前缀,如下所示:

getRandCode(){
    const that=this;
    sangforVpn.reGetRandCode(function(result){
        uni.showModal({title:"getRandCode-success",content:JSON.stringify(result)});
        that.randCode="data:image/png;base64," + result.codeBase64;
    },function(result){
        uni.showModal({title:"getRandCode-failed",content:JSON.stringify(result)});
    });
},

隐私、权限声明

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

"android.permission.INTERNET", "android.permission.READ_PHONE_STATE", "android.permission.ACCESS_WIFI_STATE", "android.permission.ACCESS_NETWORK_STATE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.FOREGROUND_SERVICE"

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

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

许可协议

请参考开源项目地址的开源协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问