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;
    }   
}

これは正常に機能します。ただし、1つの明白な欠陥があります。

「http://www.example.com/ikb3987basd」はどうですか

拡張子のないファイルタイプをどのように認識できますか?チェックできるファイルに関するデータはありますか?

4

3 に答える 3

1

要求をサーバーに送信する前に、応答のコンテンツ タイプを知ることはできません。現時点では、クライアントは特定の URL の背後に何が隠されているかを知る方法がありません。クライアントがサーバーの応答を受信した場合にのみ、HTTP ヘッダーの Content-Type フィールドを検査できます。

あなたが達成したいことは、パブリックUIWebViewAPI では不可能だと思います (最初に独立した接続を開始して URL のヘッダーを取得し、応答の Content-Type を確認しない限り)。

于 2011-04-11T13:20:25.540 に答える
0

特殊相対性理論を使用すると、ファイルを持っていないときにファイルについて知ることは不可能であることを証明できます....:p

さらに、「pdf」の URL 全体を分析する代わりに、取得できるファイル拡張子を確認するだけです。

[[url absoluteString] pathExtension]

于 2011-04-15T08:59:21.193 に答える
0

NSURLProtocolsublcass を使用して、 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];

}

Appleの例ここで見つけることができるNSURLProtocolの詳細

于 2016-11-24T16:42:54.833 に答える