美文网首页基础应用
iOS / NSURLSessionConfiguration

iOS / NSURLSessionConfiguration

作者: 不不不不同学 | 来源:发表于2020-03-15 18:55 被阅读0次

    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
    

    相关文章

      网友评论

        本文标题:iOS / NSURLSessionConfiguration

        本文链接:https://www.haomeiwen.com/subject/tbiashtx.html