Распознавание типов файлов UIWebView - PullRequest
3 голосов
/ 11 апреля 2011

Я хочу определить, когда 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 ]

1 голос
/ 11 апреля 2011

Вы не можете знать тип содержимого ответа, прежде чем отправить запрос на сервер. На данный момент у клиента нет возможности узнать, что скрывается за определенным URL. Только когда клиент получает ответ сервера, он может проверить поле Content-Type в заголовке HTTP.

Я полагаю, что то, чего вы хотите достичь, невозможно с помощью общедоступного UIWebView API (если вы сначала не запустите независимое соединение, чтобы получить заголовок URL-адреса и проверить тип содержимого ответа).

0 голосов
/ 24 ноября 2016

Вы можете использовать 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 и здесь

0 голосов
/ 15 апреля 2011

Используя специальную теорию относительности, вы можете доказать, что невозможно узнать о файле, даже если у вас его нет ....: p

И, кроме того, вместо анализа всего URL-адреса для поиска 'pdf«Я бы просто посмотрел на расширение файла, которое вы можете получить из

[[url absoluteString] pathExtension]

...