美文网首页
iOS_网络请求_NSURLSessionDelegate

iOS_网络请求_NSURLSessionDelegate

作者: 狍子扛枪 | 来源:发表于2017-05-05 12:19 被阅读0次
    /*
     * 处理session级的事件
     */
    @protocol NSURLSessionDelegate <NSObject>
    @optional
    
    // 通知session的delegate session被invalid了
    - (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(nullable NSError *)error;
    
    /*
    * 只要访问的是HTTPS的路径就会调用
    * 该方法的作用就是处理服务器返回的证书, 需要在该方法中告诉系统是否需要安装服务器返回的证书
    * NSURLAuthenticationChallenge : 授权质问
    *+ 受保护空间
    *+ 服务器返回的证书类型
    */
    - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
                                                 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler {
        // 1.从服务器返回的受保护空间中拿到证书的类型
        // 2.判断服务器返回的证书是否是服务器信任的
        if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
            NSLog(@"是服务器信任的证书");
            // 3.根据服务器返回的受保护空间创建一个证书
    //         void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *)
    //         代理方法的completionHandler block接收两个参数:
    //         第一个参数: 代表如何处理证书
    //         第二个参数: 代表需要处理哪个证书
            //创建证书
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            // 4.安装证书   completionHandler(NSURLSessionAuthChallengeUseCredential , credential);    
        }
    }
    
    //处理应用切到后台之后
    - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session NS_AVAILABLE_IOS(7_0);
    
    @end
    
    /*
     * Messages related to the operation of a specific task.
     */
    @protocol NSURLSessionTaskDelegate <NSURLSessionDelegate>
    @optional
    
    /* An HTTP request is attempting to perform a redirection to a different
     * URL. You must invoke the completion routine to allow the
     * redirection, allow the redirection with a modified request, or
     * pass nil to the completionHandler to cause the body of the redirection 
     * response to be delivered as the payload of this request. The default
     * is to follow redirections. 
     *
     * For tasks in background sessions, redirections will always be followed and this method will not be called.
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                         willPerformHTTPRedirection:(NSHTTPURLResponse *)response
                                         newRequest:(NSURLRequest *)request
                                  completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler;
    
    /* The task has received a request specific authentication challenge.
     * If this delegate is not implemented, the session specific authentication challenge
     * will *NOT* be called and the behavior will be the same as using the default handling
     * disposition. 
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
                                  completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
    
    /* Sent if a task requires a new, unopened body stream.  This may be
     * necessary when authentication has failed for any request that
     * involves a body stream. 
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                  needNewBodyStream:(void (^)(NSInputStream * _Nullable bodyStream))completionHandler;
    
    /* Sent periodically to notify the delegate of upload progress.  This
     * information is also available as properties of the task.
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                                    didSendBodyData:(int64_t)bytesSent
                                     totalBytesSent:(int64_t)totalBytesSent
                           totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend;
    
    /*
     * Sent when complete statistics information has been collected for the task.
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
    
    /* Sent as the last message related to a specific task.  Error may be
     * nil, which implies that no error occurred and this task is complete. 
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
                               didCompleteWithError:(nullable NSError *)error;
    
    @end
    
    /*
     * Messages related to the operation of a task that delivers data
     * directly to the delegate.
     */
    @protocol NSURLSessionDataDelegate <NSURLSessionTaskDelegate>
    @optional
    /* The task has received a response and no further messages will be
     * received until the completion block is called. The disposition
     * allows you to cancel a request or to turn a data task into a
     * download task. This delegate message is optional - if you do not
     * implement it, you can get the response as a property of the task.
     *
     * This method will not be called for background upload tasks (which cannot be converted to download tasks).
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                     didReceiveResponse:(NSURLResponse *)response
                                      completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;
    
    /* Notification that a data task has become a download task.  No
     * future messages will be sent to the data task.
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                  didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask;
    
    /*
     * Notification that a data task has become a bidirectional stream
     * task.  No future messages will be sent to the data task.  The newly
     * created streamTask will carry the original request and response as
     * properties.
     *
     * For requests that were pipelined, the stream object will only allow
     * reading, and the object will immediately issue a
     * -URLSession:writeClosedForStream:.  Pipelining can be disabled for
     * all requests in a session, or by the NSURLRequest
     * HTTPShouldUsePipelining property.
     *
     * The underlying connection is no longer considered part of the HTTP
     * connection cache and won't count against the total number of
     * connections per host.
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                    didBecomeStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    /* Sent when data is available for the delegate to consume.  It is
     * assumed that the delegate will retain and not copy the data.  As
     * the data may be discontiguous, you should use 
     * [NSData enumerateByteRangesUsingBlock:] to access it.
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                         didReceiveData:(NSData *)data;
    
    /* Invoke the completion routine with a valid NSCachedURLResponse to
     * allow the resulting data to be cached, or pass nil to prevent
     * caching. Note that there is no guarantee that caching will be
     * attempted for a given resource, and you should not rely on this
     * message to receive the resource data.
     */
    - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask
                                      willCacheResponse:(NSCachedURLResponse *)proposedResponse 
                                      completionHandler:(void (^)(NSCachedURLResponse * _Nullable cachedResponse))completionHandler;
    
    @end
    
    /*
     * Messages related to the operation of a task that writes data to a
     * file and notifies the delegate upon completion.
     */
    @protocol NSURLSessionDownloadDelegate <NSURLSessionTaskDelegate>
    
    /* Sent when a download task that has completed a download.  The delegate should 
     * copy or move the file at the given location to a new location as it will be 
     * removed when the delegate message returns. URLSession:task:didCompleteWithError: will
     * still be called.
     */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                  didFinishDownloadingToURL:(NSURL *)location;
    
    @optional
    /* Sent periodically to notify the delegate of download progress. */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                               didWriteData:(int64_t)bytesWritten
                                          totalBytesWritten:(int64_t)totalBytesWritten
                                  totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
    
    /* Sent when a download has been resumed. If a download failed with an
     * error, the -userInfo dictionary of the error will contain an
     * NSURLSessionDownloadTaskResumeData key, whose value is the resume
     * data. 
     */
    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
                                          didResumeAtOffset:(int64_t)fileOffset
                                         expectedTotalBytes:(int64_t)expectedTotalBytes;
    
    @end
    
    @protocol NSURLSessionStreamDelegate <NSURLSessionTaskDelegate>
    @optional
    
    /* Indiciates that the read side of a connection has been closed.  Any
     * outstanding reads complete, but future reads will immediately fail.
     * This may be sent even when no reads are in progress. However, when
     * this delegate message is received, there may still be bytes
     * available.  You only know that no more bytes are available when you
     * are able to read until EOF. */
    - (void)URLSession:(NSURLSession *)session readClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    /* Indiciates that the write side of a connection has been closed.
     * Any outstanding writes complete, but future writes will immediately
     * fail.
     */
    - (void)URLSession:(NSURLSession *)session writeClosedForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    /* A notification that the system has determined that a better route
     * to the host has been detected (eg, a wi-fi interface becoming
     * available.)  This is a hint to the delegate that it may be
     * desirable to create a new task for subsequent work.  Note that
     * there is no guarantee that the future task will be able to connect
     * to the host, so callers should should be prepared for failure of
     * reads and writes over any new interface. */
    - (void)URLSession:(NSURLSession *)session betterRouteDiscoveredForStreamTask:(NSURLSessionStreamTask *)streamTask;
    
    /* The given task has been completed, and unopened NSInputStream and
     * NSOutputStream objects are created from the underlying network
     * connection.  This will only be invoked after all enqueued IO has
     * completed (including any necessary handshakes.)  The streamTask
     * will not receive any further delegate messages.
     */
    - (void)URLSession:(NSURLSession *)session streamTask:(NSURLSessionStreamTask *)streamTask
                                     didBecomeInputStream:(NSInputStream *)inputStream
                                             outputStream:(NSOutputStream *)outputStream;
    
    @end
    

    相关文章

      网友评论

          本文标题:iOS_网络请求_NSURLSessionDelegate

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