NSURLProtocol 使用 AJAX 超时

Posted

技术标签:

【中文标题】NSURLProtocol 使用 AJAX 超时【英文标题】:NSURLProtocol time out with AJAX 【发布时间】:2015-03-12 13:14:08 【问题描述】:

我使用 NSURLProtocol 为所有从 UIWebview 发出的请求添加自定义标头。 在此 WebView 上执行某些操作时,会触发 AJAX 调用以显示消息。此显示消息的操作使用 AJAX,并且在我使用 NSURLProtocol 方法时总是超时。没有 NSURLProtocol 也可以正常工作。

如果需要更多信息,请告诉我。这是我的代码。

+ (BOOL)canInitWithRequest:(NSURLRequest *)request

    if ([NSURLProtocol propertyForKey:kUserAgentKey inRequest:request] != nil)
        return NO;

    return YES;


+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request

    return request;


- (void)startLoading

    NSMutableURLRequest *newRequest = [self.request mutableCopy];


     NSString *  customAgent = @"CustomeHeaderValue";
    [newRequest setValue:customAgent forHTTPHeaderField:kUserAgentKey];

    [NSURLProtocol setProperty:@YES forKey:kUserAgentKey inRequest:newRequest];
    self.connection = [NSURLConnection connectionWithRequest:newRequest delegate:self];



- (void)stopLoading

    [self.connection cancel];


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    [self.client URLProtocol:self didLoadData:data];


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    [self.client URLProtocol:self didFailWithError:error];
    self.connection = nil;


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
`enter code here`

    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];


- (void)connectionDidFinishLoading:(NSURLConnection *)connection

    [self.client URLProtocolDidFinishLoading:self];
    self.connection = nil;


- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response 
    if (response) 
           [[self client] URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
    

    return request;

【问题讨论】:

AJAX请求是否同步? 确实如此。实现异步会有所帮助。但是如果 Web 开发人员由于某些内部原因无法使 AJAX 异步呢? @AdityaGaonkar 你解决了同步请求的问题吗? 【参考方案1】:

尝试实现这个方法

-(NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
[self.client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
return request;
}

【讨论】:

这对我不起作用。最后,Web 开发人员同意使 AJAX 异步。我相信这是正确的做法。但是,我尝试在主线程上显式运行 NSURLConnection,即使 AJAX 是同步的,它也出于某种未知原因工作。

以上是关于NSURLProtocol 使用 AJAX 超时的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSURLProtocol 在 iOS 中拦截网络调用(REST)

NSURLProtocol的总结

NSURLProtocol 可以与 NSURLSession upload, downloaddataTask 一起使用吗

注册 NSURLProtocol (URLProtocol) 类以与外部应用程序一起使用?

NSURLProtocol总结:NSURLProtocol 的本质是对特殊的scechme进行特殊的协议定制

使用NSURLProtocol实现UIWebView的离线缓存