移动端iOS SDK常见问题Q&A
此文档列举了常见的iOS SDK功能使用上的问题
Q: 怎么获取帮助?
如果是VPN配置问题,如不知道资源(可以访问的内网段)如何配置,能否可以多人共用一个VPN账户等配置与功能问题,可以咨询400团队
如果是SDK集成问题,如反复检查后,仍然集成编译不过,运行报错等,可以咨询SDK对应平台的技术支撑研发
Q: 什么是EasyApp,L3VPN模式
详见文档 <什么是EasyApp/L3VPN模式,应该选择哪种模式?> 快速解释: SDK有两种工作模式:EasyApp与L3VPN,对这两个模式的简述如下:
EasyApp模式: 通过对网络接口挂钩,在App进程内部建立一层代理,在TCP层进行VPN转发,只对本App有效 优点: 集成相对方便一些 缺点: 由于不是系统提供接口,有较严重的兼容性风险,目前已知: 1 无法兼容WkWebView(暂无方案解决) 2 WebSocket 方式的请求需要额外的定制(暂无方案解决)
L3VPN模式 通过Apple在iOS9以后提供标准VPN扩展 NetworkExtion(独立于主App的进程,也就是说,主App杀掉后,扩展进程仍然存活), 在iOS设备上建立虚拟网卡,在IP层进行转发,对整个设备有效 优点: Apple提供的标准接口,转发是在IP层,稳定性很好 缺点: 1 集成需要申请 NetworkExtion 描述文件 (有详细文档教程) 2 如果要发布到AppStore上,则要注意额外说明使用场景是接入企业内网(如果是企业发布,则无需担心)
目前是推荐使用L3VPN模式,因为这是Apple标准接口,比较稳定,无兼容性问题,后续优化工作也会倾向于L3VPN模式
Q:怎么知道自己使用SDK的版本
通过以下步骤
看日志中有无
[EasyApp] [info] [SangforSDK] Start sangfor sdk service [7.6.2.88895], running on iOS_11.3.
的日志,如果有,就是M7.6.2版本的SDK如果没有日志,那么就确定是M7.5.2版本的SDK了,如果需要知道确切的版本,则需要您主动调用
[[AuthHelper getInstance] getSdkVersion];
Q:M7.6.2与M7.5.2的区别(强烈建议更新到最新的M7.6.2)
- M7.5 : SDK老版本,API较为不合理,目前除了必现的崩溃问题外,已经基本不再维护,后续优化也不会不会在此版本上做了
- M7.6.2: SDK新版本,目前默认取到的就是M7.6.2版本,优化了API结构,优化与稳定化的工作都会在这个版本上进行
Q:怎么取SangforSDK日志
现在比较麻烦,可以尝试通过以下步骤,后续会改进分享接口
(请在取日志时,特别记一下出问题的时间)
如果您可以XCode运行工程,那么就比较好办,从XCode启动工程,然后直接将日志复制出来
如果是已经打包好的工程,可以通过iTunes的文件共享看到
如果iTunes中看不到客户的App,就需要客户的App在Info.plist中配置
Application supports iTunes file sharing
为YES
Q:SDK支持模拟器么?
不支持,因为SDK依赖的第三方库没有 i386 与 x86 架构,所以无法支持模拟器
Q:SDK支持哪些架构?支持armv7s么?
SDK支持 armV7 与 arm64 ,也就是32位与64位版本; SDK不支持armv7s版本,您可以去掉XCode配置中的armv7s架构,因为armv7架构也是支持在iPhone5S上运行的
Q:SDK支持重连么?
EasyApp模式,
7.6.2
支持重连,方式为60s一次的timeqry,或者是链接被服务端拒绝时,此时会启动异步重连流程L3VPN模式,
7.6.2
支持免密功能的重连(也就是说如果想要L3VPN模式的SDK自动重连,需要支持免密模式,并对相应用户组开启免密功能(VPN服务端至少需要M7.6.1版本))
Q:什么是免密自动认证?
免密自动认证是在VPN M7.6.1推出的功能,可以在VPN控制台端进行配置,配置后,在这个策略组的用户就可以拥有免密自动认证功能(当被VPN服务端物无流量自动注销后或网络原因不通断开后,会自动进行重新认证)
SDK在 登录成功 后可以通过下述接口获取到当前登录的用户是否支持免密认证
(BOOL)ticketAuthAvailable;
Q:为什么VPN用着有时候会自己断开,什么是无流量自动注销?
排查网络、用户互踢等因素,也有可能是设置的无流量自动注销
无流量注销指的是,如果用户长时间未使用VPN,会自动将用户注销掉,具体设置如下图
Q:网络变化了怎么办,例如从内网切换到外网?
最新版本的SDK(7.6.2.85718
)支持内外网切换后,会自动重新选路,如果VPN地址发生了变化,会自动重连
Q:SDK L3VPN模式支持哪些型号的设备,支持哪些iOS版本
L3VPN模式支持iOS9以上设备(与设备型号无关,iOS9以上即可)
Q:SDK L3VPN模式的 (VPNStatus)queryStatus
状态很不准,并且杀掉App后再起来,检查结果是错的
原因:
(VPNStatus)queryStatus
是在SDK启动成功后,以定时查询方式查询VPN的连接状态,导致在没有SDK没有启动时无法获取到正确的状态,杀掉App后,由于SDK并没有启动过,所以查询状态不准。
解决:
- 最新的SDK(
7.6.2.88895
)已经添加异步接口
(void)querySFNEStaus:(void (^)(SFNEStatus neStatus)) queryHandler
可以通过这个接口获取 NetworkExtion
插件的存活状态,目前可以使用这个接口替换(VPNStatus)queryStatus
来判断是否需要重新启动SDK的L3VPN
模式
(VPNStatus)queryStatus
这个接口也在持续改进中
ps: 这里两个接口的语义是不同的
(VPNStatus)queryStatus
:VPN是否在线,状态值是通过跨进程通信去PacketTunnel
进程获取的
(void)querySFNEStaus:
:NetworkExtion扩展PacketTunnel是否存在,如果不存在,则VPN肯定不在线;如果存在,则VPN可能在线,可能处于重连过程中
Q:SDK L3VPN模式的 (void)vpnLogout
接口为什么调用了没有反应
原因:
(void)vpnLogout
接口会判断当前SDK的运行状态,是L3VPN模式时才会去关闭PacketTunnel,在杀掉App重新启动时,用这个API去注销时,由于当前SDK运行状态未确定,导致无法关闭PacketTunnel
解决:
最新版本的SDK已经解决此问题(请尝试更新到最新SDK)
Q:SDK L3VPN模式的能不能做到杀掉App后自动关闭PacketTunnel
目前暂无方案,因为PacketTunnel是一个独立进程,而且关闭PacketTunnel需要一个异步请求过程,所以即使在
- (void)applicationWillTerminate:(UIApplication *)application
:
中尝试关闭插件也不行,
同时,在最近应用列表中划掉App时,应用也无法接受到该回调
Q:SDK L3VPN模式第一次启动时会有个允许提示,这个提示可以去掉么?
无法去掉,这是Apple对iOS上运行安全的一个保证,启动NetworkExtion扩展必须要用户同意