1、NSURLSessionConfiguration 是什么?
(1.1)作用
NSURLSessionConfiguration 为 NSURLSession 配置一些请求所需要的策略(如:超时、缓存策略、链接需求等)
(1.2)与 NSURLSession 关系
NSURLSession 会拷贝 NSURLSessionConfiguration。所以 NSURLSession 一旦初始化结束,就没有机会再更改 NSURLSessionConfiguration。除非初始化一个 NSURLSession。
2、NSURLSessionConfiguration 的种类
(2.1)defaultSessionConfiguration
默认配置:
(1)使用持久化的硬盘缓存
(2)存储证书到用户钥匙链
(3)存储cookie到shareCookie。
介绍:
如果想要移植原来基于NSURLConnect的代码到NSURLSession,可使用该默认配置,然后再根据需要定制该默认配置。
(2.2)ephemeralSessionConfiguration
默认配置:
(1)不适用永久持存cookie、证书、缓存
(2)最佳优化数据传输(没懂什么意思)
介绍:
(1)当程序作废session时,所有的ephemeral session 数据会立即清除。
(2)此外,如果你的程序处于暂停状态,内存数据可能不会立即清除,但是会在程序终止或者收到内存警告或者内存压力时立即清除。
(2.3)backgroundSessionConfiguration
(1)可以上传下载HTTP和HTTPS的后台任务(程序在后台运行)
(2)在后台时,将网络传输交给系统的单独的一个进程。
介绍:
(1)identifier 是configuration的唯一标示,不能为空或nil
(2)如果程序是被系统正常终止的和重新启动,可以使用同一个identifier创建configuration和session,并且能恢复终止时的传输状态。
(3)如果程序是被用户在手动退出的,session会取消所有的后台任务,届时不能再唤醒application,如果想要再次开始传输,必须用户手动开启application。
3、NSURLSessionConfiguration API介绍
(3.1)属性介绍
(3.1.1)identifier (用于后台 session configuration 的 ID)
(1)若在后台任务正在传输时App退出,可使用此 identifier 在App重启时,创建一个新的 configuration 、session,即可关联之前传输。
@property (nullable, readonly, copy) NSString *identifier;
(3.1.2)requestCachePolicy (默认缓存策略)
@property NSURLRequestCachePolicy requestCachePolicy;
(1)类型枚举如下
typedef NS_ENUM(NSUInteger, NSURLRequestCachePolicy)
{
NSURLRequestUseProtocolCachePolicy = 0,
NSURLRequestReloadIgnoringLocalCacheData = 1,
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4,
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
NSURLRequestReturnCacheDataElseLoad = 2,
NSURLRequestReturnCacheDataDontLoad = 3,
NSURLRequestReloadRevalidatingCacheData = 5,
};
(3.1.3)timeoutIntervalForRequest (请求超时时间)
(1)若在给定的超时时间内,没有数据传输,则会导致超时
@property NSTimeInterval timeoutIntervalForRequest;
(3.1.4)timeoutIntervalForResource (资源超时时间)
(1)若在给定超时时间内,无法检索资源,则会导致超时
@property NSTimeInterval timeoutIntervalForRequest;
(3.1.5)networkServiceType(请求的服务类型)
(1)指定网络传输类型。准确指定传输类型,可让系统快速响应,提高传输质量、延长电池寿命等。
@property NSURLRequestNetworkServiceType networkServiceType;
(2)类型枚举如下
typedef NS_ENUM(NSUInteger, NSURLRequestNetworkServiceType)
{
NSURLNetworkServiceTypeDefault = 0, // 标准网络传输,默认使用,Standard internet traffic
NSURLNetworkServiceTypeVoIP API_DEPRECATED("Use PushKit for VoIP control purposes", macos(10.7,10.15), ios(4.0,13.0), watchos(2.0,6.0), tvos(9.0,13.0)) = 1, // Voice over IP control traffic
NSURLNetworkServiceTypeVideo = 2, // 影像传输 Video traffic
NSURLNetworkServiceTypeBackground = 3, // 后台传输,优先级不高时可使用。对用户不需要的网络操作可使用 Background traffic
NSURLNetworkServiceTypeVoice = 4, // 语音传输 Voice data
NSURLNetworkServiceTypeResponsiveData = 6, // 响应数据 Responsive data
NSURLNetworkServiceTypeAVStreaming API_AVAILABLE(macosx(10.9), ios(7.0), watchos(2.0), tvos(9.0)) = 8 , // Multimedia Audio/Video Streaming
NSURLNetworkServiceTypeResponsiveAV API_AVAILABLE(macosx(10.9), ios(7.0), watchos(2.0), tvos(9.0)) = 9, // Responsive Multimedia Audio/Video
NSURLNetworkServiceTypeCallSignaling API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) = 11, // Call Signaling
};
(3.1.6)allowsCellularAccess (是否允许请求使用蜂窝数据)
@property BOOL allowsCellularAccess;
(3.1.7)allowsExpensiveNetworkAccess (是否允许请求使用昂贵网络)
(1)iOS 13 新增属性
(2)默认为 YES
(3)具体是指什么网络不清楚
@property BOOL allowsExpensiveNetworkAccess
(3.1.8)allowsConstrainedNetworkAccess (是否允许请求在受限模式网络中进行)
(1)iOS 13 新增属性
(2)默认为 YES
(3)猜测是“低数据模式”
@property BOOL allowsConstrainedNetworkAccess
(3.1.9)waitsForConnectivity (是否等待连接)
(1)iOS 11 新增属性
(2)默认为 NO
(3)设置为 YES,将会等待网络连接可用,而不是在无网络连接时候立即失败(如 NSURLErrorNotConnectedToInternet)
(4)等待连接时,不应用 timeoutIntervalForRequest 属性,但应用 timeoutIntervalForResource 属性
(5)不理想的、需等待的连接场景,(如 allowsCellularAccess为NO,但当前是蜂窝网络;或需要 VPN 连接去到达所需的主机)
(6)后台 Session 会忽略此属性,因为该 Session 总是会等待连接。
@property BOOL waitsForConnectivity
(3.1.10)discretionary (是否系统安排任务)
(1)允许根据系统的判断,来安排后台任务,以获得最佳性能
@property (getter=isDiscretionary) BOOL discretionary
(3.1.11)sharedContainerIdentifier (共享数据容器的ID)
(1)若 App扩展,需要用到后台Session,则必需给此属性设置一个有效的ID值。否则该Session的所有传输都会失败,并报错 NSURLErrorBackgroundSessionRequiresSharedContainer
@property (nullable, copy) NSString *sharedContainerIdentifier
(3.1.12)sessionSendsLaunchEvents (是否允许发送启动事件)
(1)是否允许在后台重启App,当后台Session的任务完成时,或需要验证时。
(2)仅适用于使用 `+backgroundSessionConfigurationWithIdentifier` 创建的 Configuration
(3)默认为 YES
@property BOOL sessionSendsLaunchEvents
(3.1.13)connectionProxyDictionary (代理字典)
(1)如 <CFNetwork/CFHTTPStream> 所描述(不太懂此属性)
@property (nullable, copy) NSDictionary *connectionProxyDictionary;
(3.1.14)TLS相关 (不太懂此属性)
(1)TLS协议的最小允许版本,来自<Security/SecureTransport.h> */
(2)默认值是 kSSLProtocol3,即 SSL3.0 */
@property SSLProtocol TLSMinimumSupportedProtocol;
(1)TLS协议的最高允许版本,来自<Security/SecureTransport.h> */
(2)默认值是 kTLSProtocol12,即 TLS1.2 */
@property SSLProtocol TLSMaximumSupportedProtocol ;
(1)TLS协议的最小允许版本,来自<Security/SecProtocolTypes.h> */
(2)iOS 13 新增 */
@property tls_protocol_version_t TLSMinimumSupportedProtocolVersion;
(1)TLS协议的最高允许版本,来自<Security/SecProtocolTypes.h> */
(2)iOS 13 新增 */
@property tls_protocol_version_t TLSMaximumSupportedProtocolVersion API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));
(3.1.15)HTTP相关
(1)是否允许使用 Http 管道 */
(2)可显著减少请求的加载时间,是由于没有被服务器广泛支持,默认是 NO */
@property BOOL HTTPShouldUsePipelining;
(1)是否允许 Session 给 requests 设置 cookies */
(2)使用的是 HTTPCookieStorage 属性存储的值 */
@property BOOL HTTPShouldSetCookies;
(1)接受 cookie 的策略
(2)这将重写由 cookie 存储指定的策略
(3)决定了什么情况下 Session 应该接受从服务器发出的 Cookie
@property NSHTTPCookieAcceptPolicy HTTPCookieAcceptPolicy;
(4)枚举如下
typedef NS_ENUM(NSUInteger, NSHTTPCookieAcceptPolicy) {
NSHTTPCookieAcceptPolicyAlways, // 接受所有的cookies
NSHTTPCookieAcceptPolicyNever, // 拒绝所有的cookies
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain // 只接受从主文档中域的cookie
};
(1)设置额外添加到session中的reques的请求头(header)
(2)只在请求中,没有这些标头时,才将它们添加到请求中
(3)默认为空
(4)此属性会给所有使用该 configuration 的 session,生成的 task 中的NSURLRequest 添加额外的请求头
(5)NSURLSession 已经默认给 NSURLRequest 添加一些请求头部字段,包括Authorization、Connection、Host、Proxy-Authenticate、Proxy-Authorization、WWW-Authenticate。因此不要再不要修改这些请求头
(6)可以额外添加的请求头部字段包括Accept、Accept-Language、User-Agent等
@property (nullable, copy) NSDictionary *HTTPAdditionalHeaders;
(1)指定session内,可同时连接一个主机的最大连接数
@property NSInteger HTTPMaximumConnectionsPerHost;
(1)要使用的 cookie 存储对象
(2)若为 nil,则表示不应处理任何cookie
@property (nullable, retain) NSHTTPCookieStorage *HTTPCookieStorage;
(3.1.16)URLCredentialStorage(证书存储对象)
(1)证书储存对象
(2)为 nil,则表示证书储存对象不使用
@property (nullable, retain) NSURLCredentialStorage *URLCredentialStorage;
(3.1.17)URLCache(URL资源缓存)
(1)URL资源缓存
(2)为 nil,则表示不执行任何缓存
@property (nullable, retain) NSURLCache *URLCache;
(3.1.18)shouldUseExtendedBackgroundIdleMode(是否使用扩展后台空闲模式)
(1)为创建的任何 TCP Socket,启用扩展的后台空闲模式
(2)启用此模式,要求系统保持Socket处于打开状态,并在进程转移到后台时,延迟收回Socket
@property BOOL shouldUseExtendedBackgroundIdleMode
(3.1.19)protocolClasses(协议类数组)
(1)一个可选的类对象数组,它是NSURLProtocol的子类。
(2)当认定一个类实例,可被用于给定的URL方案时,类将被调用 +canInitWithRequest: 方法
(3)不应该使用 +[NSURLProtocol registerClass:],因为该方法会将您的类,注册到默认会话中,而不是注册到NSURLSession的实例中。
(4)自定义 NSURLProtocol 子类,不能用于后台会话。
(5)可用来配置某个特定的session,所使用的自定义协议(该协议是 NSURLProtocol 的子类)的数组。
@property (nullable, copy) NSArray<Class> *protocolClasses;
(3.1.20)multipathServiceType(多路径连接策略)
(1)用于连接的多路径服务类型。默认是NSURLSessionMultipathServiceTypeNon
(2)指定通过 Wi-Fi 和 蜂窝网络传输数据的多路径 TCP 的连接策略。
@property NSURLSessionMultipathServiceType multipathServiceType