8

UIWebViewにリクエストを送信しています。ロードされたWebページにAJAX呼び出しがあります。ユーザーがログインしているかどうかを判断するには、AJAXトラフィックを分析する必要があります。これを行うために、AppDelegateにNSURLCacheをインストールしました。

MYURLCache *cache = [[MYURLCache alloc] init];
[NSURLCache setSharedURLCache:cache];

このMYURLCacheクラスは、Webビューを通過するトラフィックを正しく受信します。AJAX呼び出しのみを終了できます。次に、AJAX呼び出しの独自の要求を生成します。これは、Webサーバーから完全に細かい応答を返します。したがって、ここで行う最後のステップは、NSCachedURLResponse戻りオブジェクトを作成することです。私もこれを管理しましたが、オブジェクトを返すときにWebビューは何もしません。nilだけを返すと、WebViewはすべてを正常にロードします(nilはNSURLCacheのメッセージであり、何もキャッシュされないため、WebViewはそれ自体でロードを開始する必要があります)。

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
    if ([[[request URL] absoluteString] rangeOfString:@"/ajax/"].location == NSNotFound) {
        return nil;
    } else {

    ASIHTTPRequest *asirequest = [ASIHTTPRequest requestWithURL:[request URL]];
    [asirequest setValidatesSecureCertificate:NO];
    [asirequest startSynchronous];
    NSError *error = [asirequest error];
    NSData* data = [[asirequest responseString] dataUsingEncoding:NSUTF8StringEncoding];

    // Create the cacheable response
    NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
    NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

    NSLog(@"cachedResponse %@", cachedResponse);
    NSLog(@"cachedResponse data %@", [[NSString alloc] initWithData:[cachedResponse data] encoding:NSUTF8StringEncoding]);

    return cachedResponse;
}  

return nil;
}
4

1 に答える 1

8

この問題に対する 1 つの解決策を見つけました...欠落していたヘッダーに関係があると思います。

交換したら

NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

全体が機能します。さらに、この回答は、リクエストの追加のカスタム ヘッダーを提案しました。https://stackoverflow.com/a/15234850/274518

NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"};
NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers];

私の場合、私はそれを必要としませんでした。

于 2013-03-06T16:42:28.593 に答える