一、引言
大数据分析最核心的是数据,我们不仅仅要做到采集数据,还需要把数据上传到指定的服务端。然后再经过服务端的存储、抽取、分析和展现,才能充分发挥数据真正的价值。
神策分析 iOS SDK 针对数据传输,从完整性、正确性以及高效性等多方面综合考虑,设计并实现了一套适用于数据采集的网络传输方案。
下面针对神策分析 iOS SDK 网络模块进行解析,希望能够给大家提供一些参考。
二、网络请求方案
iOS 中网络请求的实现有多种方式,例如:苹果官方提供的网络请求 API ;或者一些开源网络框架。下面分别介绍这两种方案的优缺点。
2.1 苹果官方 API
基于苹果官方 API 实现的网络请求一般使用 NSURLSession 或者 NSURLConnection 。但是,NSURLConnection 发送网络请求的相关接口在 iOS 9.0 开始已标记为过期。因此,开发者基本都加入了 NSURLSession 的阵营。下面我们看下 NSURLSession 有哪些优缺点。
基于 NSURLSession 实现网络请求方案具有以下优点[1]:
1. 基于连接的认证方案;
2. 支持 HTTP 请求配置;
3. 可私有化存储对象;
4. 支持后台上传下载。
但是,也存在以下缺点:
1. 没有一些开源网络框架的功能易用,例如:构建复杂的网络请求和响应的处理;
2. 部分细节没有封装,需要自己处理。
2.2 开源网络框架
基于开源网络框架实现网络请求方案具有以下优点:
1. 主流的开源网络框架功能丰富、相对稳定。例如:AFNetworking 等;
2. 可以方便快捷地实现网络请求的功能。
但是,也存在以下缺点:
1. 功能较多,代码逻辑复杂,学习成本较高;
2. 内部缺陷修复难度大甚至需要依赖作者来更新维护;
3. 包含很多可能使用不到的功能;
4. 引入开源网络框架后导致体积增大。
基于开源网络框架实现网络请求方案有利有弊,大家可以根据实际需求选择合适的方案。
三、SDK 网络模块
如果 SDK 网络模块基于开源网络框架实现,客户在集成 SDK 的同时也使用了同样的开源网络框架就会导致冲突。另外,维护开源网络框架会存在版本更新不及时、问题排查困难等风险。
由于基于开源网络框架存在这些弊端,SDK 网络模块采用 NSURLSession 的方式实现。
NSURLSession 是系统提供的网络访问 API,不仅可以满足 SDK 网络请求的需要,而且功能稳定、易拓展。
3.1 实现原理
NSURLSession 可以创建一个或者多个实例,每个实例协调一组相关的数据传输任务[1]。例如:在创建一个 Web 浏览器时,App 可能会为每个选项卡或者窗口创建一个会话。一个会话用于用户交互使用,另一个会话用于后台下载。在每个会话中,App 添加了一系列任务,每个任务都是表示对特定 URL 的请求。
3.2 具体实现
3.2.1. 网络相关配置
SDK 可以对数据发送进行一系列的配置,开发者可以根据具体需求设置相应的配置,从而达到高效的数据发送效果。
SDK 的相关配置在初始化时完成,可以配置的参数如下:
1. serverURL:数据发送地址,采集的数据会发送到该地址;
2. flushInterval:两次数据发送的最小时间间隔(单位毫秒),默认为 15000 毫秒;
3. flushBulkSize:两次数据发送的最小缓存条数,当本地缓存条数达到 flushBulkSize 时则会发送数据,默认为 100 条;
4. securityPolicy:SSL 证书和自签名证书的配置;
5. flushNetworkPolicy:数据发送时的网络策略。
3.2.2. 数据发送线程封装
SDK 数据发送是在子线程中完成的,当采集的数据满足发送策略时触发异步发送,上传任务会在 SAHTTPSession 类中完成。在初始化 SDK 时,创建 SAHTTPSession 实例,并实例化 NSOperationQueue 实现多线程发送事件。具体实现代码如下:
- (void)requestWithRecords:(NSArray<SAEventRecord *> *)records completion:(vo