1

UIWebViewベースのアプリにNSURLProtocolを登録し、fileスキーム要求に応答するように設定しました。

Webビューでは、画像、CSS、JSなどをロードしますが、これらはすべて正常に機能しています。HTMLツリーのルートディレクトリにないCSSファイルの画像を参照しようとすると問題が発生します。例えば

<html>
    <head>
        <style type="text/css">
        .1 { background-image: url("1.png"); }
        </style>
        <link href="css/style.css" rel="stylesheet" type="text/css" />
        <!-- contents of css/style.css might be:
        .2 { background-image: url("../2.png"); }
        -->
    </head>
    <body>
        <div class="1">properly styled</div>
        <div class="2">not styled</div>
    </body>
</head>

NSURLProtocolに到着するリクエストを見ると、ソースツリーのどこにリクエストファイルがあるかを判断する方法がわかりません。

たとえば、上記のHTMLがというファイルにある場合source/index.html、NSURLProtocolサブクラスはファイル../2.pngからのリクエストを取得しsource/css/style.cssます。

これはに解決されるはずですが、パスにsource/2.pngそのサブディレクトリが含まれている必要があるかどうかはわかりません。css

リクエストのソースについてより多くのコンテキストを取得して、リクエストされたファイルを探すときにパスを修正する方法はありますか?

4

1 に答える 1

0

ここで説明されている、非常によく似た問題がありました: Loading resources from relative paths through NSURLProtocol subclass

私は私の中に以下を持っていましたNSURLProtocol

- (void)startLoading {
    [self.client URLProtocol:self
          didReceiveResponse:[[NSURLResponse alloc] init]
          cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    //Some other stuff
}

そして、次の問題を解決しました:

- (void)startLoading {
    [self.client URLProtocol:self
          didReceiveResponse:[[NSURLResponse alloc] initWithURL:_lastReqURL MIMEType:nil expectedContentLength:-1 textEncodingName:nil]
          cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    //Some other stuff
}

_lastReqURL はどこ_lastReqURL = request.URL;から

- (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id < NSURLProtocolClient >)client {
    self = [super initWithRequest:request cachedResponse:cachedResponse client:client];
    if (self) {
        _lastReqURL = request.URL;
        // Some stuff
    }
}

相対パスを扱う場合、NSURLResponse の URL 部分が重要であるとしか考えられません (論理的に思えます)。

于 2014-04-02T08:43:40.863 に答える