持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
前言
作为通用的数据采集SDK,其要求(尽量)不能去依赖任何第三方库。因此,我们基于Foundation框架进行网络相关的开发。
I、使用Foundation框架发送网络请求
1.1 NSURL
对于URL,大家应该很熟悉。在Foundation框架中,我们用NSURL类来表示URL。NSURL可以通过类方法+URLWithString:进行实例化。代码示例如下。
NSURL *url = [NSURL URLWithString:@”http://www.sensorsdata.cn/”];
1.2 NSURLRequest
NSURLRequest类封装了请求的两个基本数据元素:要加载的URL和请求策略。
NSURLRequest可以通过类方法+requestWithURL:实例化。代码示例如下。
NSURL *url = [NSURL URLWithString:@”http://www.sensorsdata.cn/”];NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLRequest类仅用于封装有关URL请求的信息,如果需要发送请求到服务器,必须借助其他类进行发送,比如NSURLSession、NSURLConnection等。
NSURLRequest类一般仅能在初始化时设定一些属性外,一旦创建,绝大部分属性都是只读的,不可设置或修改。它的可变子类NSMutableURLRequest则可以更加灵活地设置请求的相关属性。
1.3 NSURLSession
每个NSURLSession对象管理一组网络请求任务,每个任务表示请求一个特定的URL。
NSURLSession可以通过类方法+sharedSession创建一个单例。
使用+sharedSession类方法不需要传入NSURLSessionConfiguration对象,也不能设置代理。这样的Session可定制性很差,但可以满足我们最基本的需求。
- 创建一个NSURLSession对象
SURLSession *session = [NSURLSession sharedSession];
- 通过配置对象创建一个 session
- (instancetype)initWithServerURL:(NSURL *)serverURL {
self = [super init];
if (self) {
_serverURL = serverURL;
// 创建默认的 session 配置对象
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 设置单个主机连接数为 5
configuration.HTTPMaximumConnectionsPerHost = 5;
// 设置请求的超时时间
configuration.timeoutIntervalForRequest = 30;
// 允许使用蜂窝网络连接
configuration.allowsCellularAccess = YES;
// 创建一个网络请求回调和完成操作的线程池
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 设置同步运行的最大操作数为 1,即各操作 FIFO
queue.maxConcurrentOperationCount = 1;
// 通过配置对象创建一个 session 对象
_session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue];
}
return self;
}
1.4 NSURLSessionDataTask
是NSURLSessionTask的子类,是一个具体的网络请求类(Task),也是最常用的网络请求之一。通常,NSURLSessionDataTask用来请求数据(JSON数据)、下载数据资源(图片数据)等。
1.5 NSURLResponse
网络请求成功后,服务器的响应信息会保存在NSURLResponse或其子类NSHTTPURL Response中
1.6 ATS
从iOS 9开始,所有使用NSURLSession建立的HTTP连接默认使用ATS(App Transport Security),这个新的安全协议要求所有的网络连接必须使用HTTPS协议,否则会提示如下错误。
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
如果有一些特殊的原因需要忽略ATS限制的话,可以在Info.plist文件中添加如下配置。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
1.7 同步数据的工具类SensorsAnalyticsNetwork
- 同步数据的工具类SensorsAnalyticsNetwork
/**
同步数据的工具类
*/
@interface SensorsAnalyticsNetwork : NSObject
- (instancetype)init NS_UNAVAILABLE;
/// 数据上报的服务器地址
@property (nonatomic, strong) NSURL *serverURL;
/**
指定初始化方法
@param serverURL 服务器 URL 地址
@return 初始化对象
*/
- (instancetype)initWithServerURL:(NSURL *)serverURL NS_DESIGNATED_INITIALIZER;
/**
同步发送事件数据
@param events JSON 格式的
@return 初始化对象
*/
- (BOOL)flushEvents:(NSArray<NSString *> *)events;
@end
II 、把url中含有的中文字符转化为UTF8编码
把url中含有的中文字符转化为UTF8编码
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
QCTWebViewController *webVC = [[QCTWebViewController alloc] initWithAddress:url];