Распознавание типов файлов UIWebView
Я хочу определить, когда был нажат PDF, и отобразить его в отдельном UIWebView. Вот что у меня сейчас:
- (BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; {
NSURL *url = [request URL];
NSString *urlString = [url absoluteString];
if (fileType != @"PDF") {
if([urlString rangeOfString:@".pdf"].location == NSNotFound){
return true;
} else {
NSURL *filePath = [NSURL URLWithString:urlString];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:filePath];
[pdfViewer loadRequest:requestObj];
[self.view addSubview:topView];
fileType = @"PDF";
return false;
}
} else {
return true;
}
}
Это отлично работает. Однако у него есть один явный недостаток:
А как насчет "http://www.example.com/ikb3987basd"
Как узнать тип файла без расширения? Есть ли какие-то данные о файле, которые я могу проверить?
3 ответа
Вы не можете знать тип содержимого ответа, прежде чем отправить запрос на сервер. На данный момент клиент не может знать, что скрывается за определенным URL. Только когда клиент получает ответ сервера, он может проверить поле Content-Type в заголовке HTTP.
Я считаю, что то, чего вы хотите достичь, не возможно с общественностью UIWebView
API (если вы сначала не запустите независимое соединение, чтобы получить заголовок URL-адреса и проверить тип содержимого ответа).
Используя специальную теорию относительности, вы можете доказать, что невозможно знать о файле, даже если у вас его нет....:p
И кроме того, вместо того, чтобы анализировать весь URL для "pdf", я бы просто посмотрел на расширение файла, которое вы можете получить из
[[url absoluteString] pathExtension]
Ты можешь использовать NSURLProtocol
sublcass для отлова всех запросов и ответов, сгенерированных UIWebView
(но нет (!) WKWebView
).
В AppDelegate
в ...didFinishLaunchingWithOptions
:
[NSURLProtocol registerClass:[MyCustomProtocol class]];
Это заставит MyCustomProtocol
обрабатывать все сетевые запросы.
В реализации MyCustomProtocol
что-то вроде (код не проверен):
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
return YES;
}
+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request{
return request;
}
- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id<NSURLProtocolClient>)client
{
self = [super initWithRequest:request cachedResponse:cachedResponse client:client];
if (self) {
return self;
}
return nil;
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
// parse response here for mime-type and content-disposition
if (shouldDownload) {
// handle downloading response.URL
completionHandler(NSURLSessionResponseBecomeDownload);
} else {
completionHandler(NSURLSessionResponseAllow);
}
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}
Более подробную информацию о NSURLProtocol вы можете найти в примере Apple и здесь