@Richard J. Ross III が書いたより高レベルの API コードが必要な場合は、NSURLProtocolをサブクラス化する必要があります。
AnNSURLProtocol
は URL リクエストを処理するオブジェクトです。したがって、 NSHipsterおよびRay Wenderlichでよりよく説明されている特定のタスクに使用できます。これには、応答から HTTP ヘッダーを取得する場合が含まれます。
コード
NSURLProtocol からサブクラス化された新しいクラスを作成すると、.h ファイルは次のようになります。
@interface CustomURLProtocol : NSURLProtocol <NSURLConnectionDelegate>
@property (nonatomic, strong) NSURLConnection *connection;
@end
あなたの .m ファイルには、あなたが望むものを処理するためのこれらのメソッドが必要です
@implementation CustomURLProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
// Here you can add custom filters to init or not specific requests
return YES;
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
// Here you can modify your request
return request;
}
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b {
return [super requestIsCacheEquivalent:a toRequest:b];
}
- (void)startLoading {
// Start request
self.connection = [NSURLConnection connectionWithRequest:self.request delegate:self];
}
- (void) stopLoading {
[self.connection cancel];
self.connection = nil;
}
#pragma mark - Delegation
#pragma mark NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
// Here we go with the headers
NSDictionary *allHeaderFields = [httpResponse allHeaderFields];
}
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[self.client URLProtocol:self didLoadData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[self.client URLProtocolDidFinishLoading:self];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[self.client URLProtocol:self didFailWithError:error];
}
また、最後に行うことは、このプロトコルをロード システムに登録することです。これは、AppDelegate で簡単に実現できます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[NSURLProtocol registerClass:[CustomURLProtocol class]];
return YES;
}