2

的工作,我有一個自定義NSURLProtocol可以NSURLProtocol與NSURLSession {上傳,下載} dataTask

#import <Foundation/Foundation.h> 

@interface XXXURLProtocol : NSURLProtocol <NSURLSessionDataDelegate, NSURLSessionTaskDelegate> 

@property (nonatomic, strong) NSURLSession *session; 
@property (nonatomic, strong) NSURLSessionTask *task; 

@end 

#import "XXXURLProtocol.h" 

@implementation DXYURLProtocol 

+ (BOOL)canInitWithRequest:(NSURLRequest *)request { 
    if ([NSURLProtocol propertyForKey:YXURLProtocolHandled inRequest:request]) { 
     return NO; 
    } 
    NSString *scheme = [[request URL] scheme]; 
    NSDictionary *dict = [request allHTTPHeaderFields]; 
    return [dict objectForKey:@"custom_header"] == nil && 
    ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame || 
    [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame); 
} 

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { 
    return request; 
} 

+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a 
         toRequest:(NSURLRequest *)b { 
    return [super requestIsCacheEquivalent:a toRequest:b]; 
} 

- (void)startLoading 
{ 
    NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy]; 
    //add custom headers 
    [XXXURLProtocol addCustomHeaders:mutableReqeust]; 
    [NSURLProtocol setProperty:@(YES) 
         forKey:YXURLProtocolHandled 
        inRequest:mutableReqeust]; 
    NSURLSessionConfiguration *config;  
    config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    config.protocolClasses = @[ self ]; 
    self.session = [NSURLSession sessionWithConfiguration:config]; 
    self.task = [self.session dataTaskWithRequest:mutableReqeust]; 
    [self.task resume]; 
} 

- (void)stopLoading 
{ 
    [self.task cancel]; 
    self.task = nil; 
} 

//and all other NSURLProtocolClient protocol method 
@end 

如何讓這個自定義NSURLProtocol支持{上傳,下載} dataTask?

+0

嗨!你有沒有找到解決方案? –

回答

3

你有正確的想法,但你需要實現一些關鍵URLSessionDelegate方法傳遞到NSURLProtocol客戶端的響應和數據:


-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 
{ 
    if(error) { 
     [self.client URLProtocol:self didFailWithError:error]; 
    } else { 
     [self.client URLProtocolDidFinishLoading:self]; 
    } 
} 

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler 
{ 
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; 
    completionHandler(NSURLSessionResponseAllow); 
} 

-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data 
{ 
    [self.client URLProtocol:self didLoadData:data]; 
} 
+1

怎麼樣上傳或下載任務需要uploadTask和downloadTask – dopcn

+0

@dopcn你有沒有想過如何讓它使用uploadTask和downloadTask? – user754905

+0

@ user754905不可以 – dopcn

相關問題