ios – 使用自定义NSURLProtocol在UIWebView中通过AJAX调用加载文本文件失败

ios – 使用自定义NSURLProtocol在UIWebView中通过AJAX调用加载文本文件失败,第1张

概述我想使用UiWebView在iOS应用程序上显示一个网站.站点的某些组件(即使用 AJAX调用加载的Web服务结果)应该由本地数据替换. 请考虑以下示例: 的text.txt: foo page1.html: <html><head> <title>test</title> <script type="text/javascript" src="jquery.js"></scrip 我想使用UiWebVIEw在iOS应用程序上显示一个网站.站点的某些组件(即使用 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上根本没有任何事情发生.我试图做一些错误处理,但是既没有抛出Js AJAX错误,也没有调用uiwebviewdelegate的dIDFailLoaDWithError.

我尝试了另一个场景并创建了一个只加载图像的HTML页面:

<img src="image.png" />

并修改我的URLProtocol只是处理图像的加载 – 这是正常的.也许这与AJAX调用有关?

你知道问题可能是什么吗?

提前致谢!

解决方法 我有同样的问题,经过几天的拔毛后终于解决了:

您的问题来自您创建响应的方式,您必须创建状态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];

您可以在我的答案中看到我的完整工作实现:

How to mock AJAX call with NSURLProtocol?

希望这可以帮助,文森特

总结

以上是内存溢出为你收集整理的ios – 使用自定义NSURLProtocol在UIWebView中通过AJAX调用加载文本文件失败全部内容,希望文章能够帮你解决ios – 使用自定义NSURLProtocol在UIWebView中通过AJAX调用加载文本文件失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1078303.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存