iOS小技能:使用Foundation框架发送网络请求

215 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

/**
 
 
 同步数据的工具类
 */
@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编码

blog.csdn.net/z929118967/…

   url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
   QCTWebViewController *webVC = [[QCTWebViewController alloc] initWithAddress:url];