3

我希望检测何时单击 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”呢?

如何识别没有扩展名的文件类型?是否有一些关于我可以检查的文件的数据?

4

3 回答 3

1

在将请求发送到服务器之前,您无法知道响应的内容类型。此时,客户端无法知道某个 URL 背后隐藏着什么。只有当客户端收到服务器的响应时,它才能检查 HTTP 标头中的 Content-Type 字段。

我相信公共 API 无法实现您想要实现的目标UIWebView(除非您首先启动独立连接来检索 URL 的标头并检查响应的 Content-Type)。

于 2011-04-11T13:20:25.540 回答
0

使用狭义相对论,您可以证明即使您没有文件,也不可能知道文件....:p

此外,我不会分析“pdf”的整个 URL,而是查看您可以从中获得的文件扩展名

[[url absoluteString] pathExtension]

于 2011-04-15T08:59:21.193 回答
0

您可以使用sublcas 来捕获由(但不是 (!) )NSURLProtocol生成的所有请求和响应。UIWebViewWKWebView

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 的示例此处找到

于 2016-11-24T16:42:54.833 回答