一、NSURLSessionConfiguration介绍
NSURLSessionConfiguration对象定义使用NSURLSession对象上传和下载数据时要使用的行为和策略。上传或下载数据时,创建配置对象始终是你必须采取的第一步。你可以使用此对象来配置打算用于NSURLSession对象的超时值,缓存策略,连接要求和其他类型的信息。
在使用它来初始化会话对象之前,正确配置NSURLSessionConfiguration对象非常重要。会话对象会复制你提供的配置设置,并使用这些设置来配置会话。配置完成后,会话对象将忽略对NSURLSessionConfiguration对象所做的任何更改。如果你需要修改传输策略,则必须更新会话配置对象并使用它创建新的NSURLSession对象。
注意点:
在某些情况下,配置中定义的策略可能会被任务提供的NSURLRequest对象指定的策略覆盖。在request对象上指定的任何策略都会受到尊重,除非会话的策略更具限制性。例如,如果会话配置指定不应允许蜂窝网络,NSURLRequest对象不能请求蜂窝网络。
二、API
@interface NSURLSessionConfiguration : NSObject <NSCopying>
/* 默认配置:默认会话配置使用永久性基于磁盘的缓存(下载文件除外)并将凭证存储在用户的钥匙串中。 它还将cookie(默认情况下)存储在与NSURLConnection和NSURLDownload类相同的共享cookie存储中 */
@property (class, readonly, strong) NSURLSessionConfiguration *defaultSessionConfiguration;
// 临时配置:不使用缓存,Cookie或凭证的持久性存储的会话配置
@property (class, readonly, strong) NSURLSessionConfiguration *ephemeralSessionConfiguration;
/*允许在后台执行HTTP和HTTPS上传或下载
identifier:配置对象的唯一标识符。该参数不能为nil或空字符串
*/
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
//配置对象的唯一标识符
@property (nullable, readonly, copy) NSString *identifier;
// 缓存策略
@property NSURLRequestCachePolicy requestCachePolicy;
// 请求超时时长 默认60s
@property NSTimeInterval timeoutIntervalForRequest;
// 资源请求应该允许的最大时间 默认7天
@property NSTimeInterval timeoutIntervalForResource;
/* 网络服务类型:向操作系统提供有关底层通信用途的提示。 该提示增强了系统优先处理流量的能力,确定了唤醒蜂窝或Wi-Fi无线电所需的速度等等。 通过提供准确的信息,你可以提高系统平衡电池寿命,性能和其他考虑因素的能力。
例如,如果你的应用正在执行用户未请求的下载(例如预取内容,以便在用户选择查看内容时可用),则应指定NSURLNetworkServiceTypeBackground类型。
此设置也会影响Wi-Fi服务质量(QoS)优先级。
默认值是NSURLNetworkServiceTypeDefault。 */
@property NSURLRequestNetworkServiceType networkServiceType;
// 是否应通过蜂窝网络进行连接。 默认YES
@property BOOL allowsCellularAccess;
// 是否应等待连接变为可用或者失败 默认NO
@property BOOL waitsForConnectivity API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
/* 是否可以根据系统的判断来调度后台任务以获得最佳性能。默认NO
对于使用backgroundSessionConfigurationWithIdentifier:方法创建的配置对象,使用此属性可以让系统控制传输何时发生。对于使用其他方法创建的配置对象,该属性将被忽略。
在传输大量数据时,建议将此属性的值设置为YES。这样做可以让系统安排那些对设备而言更优化的传输。例如,系统可能会延迟传输大文件,直到设备插入并通过Wi-Fi连接到网络。
会话对象仅将该属性的值应用于在前台应用程序启动时进行传输。对于在您的应用程序处于后台时启动的传输,系统始终会自行决定开始传输 - 换句话说,系统假定此属性为YES并忽略您指定的任何值。 */
@property (getter=isDiscretionary) BOOL discretionary API_AVAILABLE(macos(10.10), ios(7.0), watchos(2.0), tvos(9.0));
@property (nullable, copy) NSString *sharedContainerIdentifier API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
/* 在传输完成时是否应该在后台继续或启动应用程序。
对于使用backgroundSessionConfigurationWithIdentifier:方法创建的配置对象,可以使用此属性来控制iOS应用程序的启动行为。 对于使用其他方法创建的配置对象,该属性将被忽略。
此属性的默认值为YES。 当此属性的值为YES时,系统会在会话任务完成或需要验证时自动唤醒或在后台启动iOS应用程序。 那时,系统调用应用程序委托的应用程序:handleEventsForBackgroundURLSession:completionHandler:方法,为它提供需要注意的会话的标识符。 如果应用程序必须重新启动,可以使用该标识符来创建一个能够为这些任务提供服务的新配置和会话对象。 */
@property BOOL sessionSendsLaunchEvents API_AVAILABLE(ios(7.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos);
// 代理字典
@property (nullable, copy) NSDictionary *connectionProxyDictionary;
// 协议协商期间应该接受的最小TLS协议。(最低支持TLS协议版本) 默认kSSLProtocol3
@property SSLProtocol TLSMinimumSupportedProtocol;
// 协议协商期间应该接受的最大TLS协议。(最高支持TLS协议版本)默认值是系统支持的最新版本的TLS
@property SSLProtocol TLSMaximumSupportedProtocol;
// 是否应使用HTTP pipelining 默认NO
@property BOOL HTTPShouldUsePipelining;
// 如果想自己提供cookie,请将此值设置为NO,并通过会话的HTTPAdditionalHeaders属性或使用自定义NSURLRequest对象的每个请求级别提供Cookie标头。 默认YES
@property BOOL HTTPShouldSetCookies;
/* Cookie接受策略:默认值是NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain。 您可以将其更改为NSHTTPCookieAcceptPolicy枚举类型中定义的任何常量。
如果您想更直接地控制接受哪些cookie,请将此值设置为NSHTTPCookieAcceptPolicyNever,然后使用allHeaderFields和cookiesWithResponseHeaderFields:forURL:方法自行从URL响应对象中提取cookie。 */
@property NSHTTPCookieAcceptPolicy HTTPCookieAcceptPolicy;
// 与请求一起发送的附加头文件的字典 默认是一个空数组
@property (nullable, copy) NSDictionary *HTTPAdditionalHeaders;
// 同时连接到给定主机的最大数量 iOS中默认值为4
@property NSInteger HTTPMaximumConnectionsPerHost;
// cookie存储
@property (nullable, retain) NSHTTPCookieStorage *HTTPCookieStorage;
// 身份验证凭据存储。
@property (nullable, retain) NSURLCredentialStorage *URLCredentialStorage;
// URL缓存
@property (nullable, retain) NSURLCache *URLCache;
@property BOOL shouldUseExtendedBackgroundIdleMode API_AVAILABLE(macos(10.11), ios(9.0), watchos(2.0), tvos(9.0));
// 在会话中处理请求的额外协议子类的数组
@property (nullable, copy) NSArray<Class> *protocolClasses;
// 指定用于通过Wi-Fi和蜂窝接口传输数据的多路径TCP连接策略的服务类型。
@property NSURLSessionMultipathServiceType multipathServiceType API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, watchos, tvos);
@end
1、缓存策略:NSURLRequestCachePolicy 是一个枚举,具体如下
/* 指定协议实现中定义的高速缓存逻辑(如果有)用于特定的URL加载请求。这是URL加载请求的默认策略。 */
NSURLRequestUseProtocolCachePolicy = 0,
/* URL加载的数据应该从原始源加载,不应该使用现有的本地缓存数据来满足URL加载请求(无论其新鲜度或有效性)。*/
NSURLRequestReloadIgnoringLocalCacheData = 1,
// 未实现
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Unimplemented
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
/* 应使用现有的缓存数据来满足URL加载请求(不管其age或到期日期)。但是,如果高速缓存中没有与URL加载请求相对应的现有数据,则会从源数据源加载该URL。 */
NSURLRequestReturnCacheDataElseLoad = 2,
/* 应使用现有的缓存数据来满足URL加载请求(不管其age或过期日期)。但是,如果高速缓存中没有与URL加载请求相对应的现有数据,则不会尝试从源数据源加载URL,并且认为加载失败。此常数指定与“脱机”模式类似的行为。 */
NSURLRequestReturnCacheDataDontLoad = 3,
// 未实现
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
2、网络服务类型:NSURLRequestNetworkServiceType 是一个枚举,具体如下
NSURLNetworkServiceTypeDefault = 0, // 标准互联网流量
NSURLNetworkServiceTypeVoIP = 1, // VoIP 控制流量
NSURLNetworkServiceTypeVideo = 2, // 视频流量
NSURLNetworkServiceTypeBackground = 3, // 用于后台流量(如文件下载)
NSURLNetworkServiceTypeVoice = 4, // 语音数据
NSURLNetworkServiceTypeCallSignaling API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) = 11, // 呼叫信号
3、Cookie接受策略:NSHTTPCookieAcceptPolicy 是一个枚举,具体如下
NSHTTPCookieAcceptPolicyAlways, // 接受所有Cookie
NSHTTPCookieAcceptPolicyNever, // 拒绝所有Cookie
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain // 仅接受来自主文档域的Cookie
网友评论