移动端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的版本

通过以下步骤

  1. 看日志中有无 [EasyApp] [info] [SangforSDK] Start sangfor sdk service [7.6.2.88895], running on iOS_11.3.的日志,如果有,就是M7.6.2版本的SDK

  2. 如果没有日志,那么就确定是M7.5.2版本的SDK了,如果需要知道确切的版本,则需要您主动调用[[AuthHelper getInstance] getSdkVersion];

Q:M7.6.2与M7.5.2的区别(强烈建议更新到最新的M7.6.2)

  1. M7.5 : SDK老版本,API较为不合理,目前除了必现的崩溃问题外,已经基本不再维护,后续优化也不会不会在此版本上做了
  2. M7.6.2: SDK新版本,目前默认取到的就是M7.6.2版本,优化了API结构,优化与稳定化的工作都会在这个版本上进行

Q:怎么取SangforSDK日志

现在比较麻烦,可以尝试通过以下步骤,后续会改进分享接口

(请在取日志时,特别记一下出问题的时间)

  1. 如果您可以XCode运行工程,那么就比较好办,从XCode启动工程,然后直接将日志复制出来

  2. 如果是已经打包好的工程,可以通过iTunes的文件共享看到

    如果iTunes中看不到客户的App,就需要客户的App在Info.plist中配置Application supports iTunes file sharingYES

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扩展必须要用户同意