使用自定义NSURLProtocol未能在UIWebView中通过AJAX调用加载文本文件(Load

2019-07-30 18:34发布

我想在使用iOS应用程序显示一个网站UiWebView 。 该网站的一些组件(即使用AJAX调用加载web服务的结果)应该由本地数据来代替。

请看下面的例子:

的text.txt:

foo

page1.html:

<html><head>
    <title>test</title>
    <script type="text/javascript" src="jquery.js"></script>
</head>
<body>
<div id="target"></div>
<script type="text/javascript">
    function init(){
        $.get("text.txt",function(text){    
            $("#target").text(text);
        });
    }
    $(init);
</script>
</body></html>

视图控制器:

@interface ViewController : UIViewController <UIWebViewDelegate>
    @property (nonatomic,assign) IBOutlet UIWebView *webview;
@end


@implementation ViewController
    @synthesize webview;
    //some stuff here
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [NSURLProtocol registerClass:[MyProtocol class]];
        NSString *url = @"http://remote-url/page1.html";
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
        [request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData];
        [webview loadRequest:request];
    }
@end

MyProtocol:

@interface MyProtocol : NSURLProtocol

@end

@implementation MyProtocol

+ (BOOL) canInitWithRequest:(NSURLRequest *)req{
    NSLog(@"%@",[[req URL] lastPathComponent]);
    return [[[req URL] lastPathComponent] caseInsensitiveCompare:@"text.txt"] == NSOrderedSame;
}

+ (NSURLRequest*) canonicalRequestForRequest:(NSURLRequest *)req{
    return req;
}

- (void) startLoading{

    NSLog(@"Request for: %@",self.request.URL);
    NSString *response_ns = @"bar";
    NSData *data = [response_ns dataUsingEncoding:NSASCIIStringEncoding];
    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL] MIMEType:@"text/plain" expectedContentLength:[data length] textEncodingName:nil];

    [[self client] URLProtocol: self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [[self client] URLProtocol:self didLoadData:data];
    [[self client] URLProtocolDidFinishLoading:self];
    [response release];
}

- (void) stopLoading{
    NSLog(@"stopLoading");
}

@end

如果我没有注册我的自定义URLProtocol正确显示页面。 如果我做startLoading()被调用时,内容被加载并stopLoading()是继触发。 但在一个UIWebView什么happends可言。 我试着做一些错误处理,但也不是一个JS AJAX错误时,抛出也不是didFailLoadWithError的的UIWebViewDelegate调用。

我尝试另一种情况下,创造,只是加载图像的HTML页面:

<img src="image.png" />

并修改了我的URLProtocol只处理图像的加载 - 这个工作正常。 也许这有什么用AJAX调用?

你有什么想法的问题可能是什么?

提前致谢!

Answer 1:

我有同样的问题,最终的头发拉了几天以后解决它:

你的问题来自于你创建的响应方式,你必须创建一个状态200的响应,并强制的WebView在必要时允许跨域请求:

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

你可以看到我的回答我的全部工作实施这里:

如何嘲笑AJAX调用与NSURLProtocol?

希望这有助于,文森特



文章来源: Loading text file by AJAX call in UIWebView using custom NSURLProtocol fails
标签: ios uiwebview