无法从UIWebview for ios 7中的url加载文件(doc,pdf等)

ram*_*ram 7 uiwebview ios ios7

我在UIWebview中加载不同的文件类型,如PDF,Excel,Doc等.某些文件需要授权并在标头中传递值.

这在ios 6中工作正常.不在ios 7中工作.下面是代码和错误消息.

NSURL *url =[NSURL URLWithString:regularURL];
self.webView.scalesPageToFit=YES;
self.request = [NSMutableURLRequest requestWithURL:url];
[self.request setValue:@"multipart/form-data" forHTTPHeaderField:@"Accept"];
NSString *auth = [NSString stringWithFormat:@"Bearer %@",userToken];
[self.request setValue:auth forHTTPHeaderField:@"Authorization"];
Run Code Online (Sandbox Code Playgroud)

错误信息:

Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted" UserInfo=0xd4b5310 {
Run Code Online (Sandbox Code Playgroud)

是否有任何额外的头字段要传递给ios 7 Web视图?

ale*_*hun 6

我试图用NSURLCache解决方案解决问题,但这对我不起作用.

你必须尝试下一个:

    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

    NSString *strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    NSURL *targetURL = [NSURL URLWithString:strUrl];

    NSData *dataFromUrl = [NSData dataWithContentsOfURL:[NSURL URLWithString: strUrl]];
    [webView loadData:dataFromUrl MIMEType:@"application/pdf" textEncodingName:nil baseURL:nil];

    [self.view addSubview:webView];
Run Code Online (Sandbox Code Playgroud)

它适用于以前没有工作过的所有文件(pdf,doc等).


Mac*_*wic 3

我已经找到了解决方案。不完美但有效!

在加载请求之前设置共享URL缓存,然后拦截错误并手动将具有正确MIME类型的缓存数据加载到webView中。

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:256 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
Run Code Online (Sandbox Code Playgroud)

进而

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSCachedURLResponse* cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:self.originalRequest];
if (cachedResponse) {
        CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)(cachedResponse.response.URL.pathExtension), NULL);
        CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass(UTI, kUTTagClassMIMEType);
        CFRelease(UTI);
        NSString* MIMETypeString = (__bridge_transfer NSString *)MIMEType;

        [self.webView loadData:cachedResponse.data MIMEType:MIMETypeString textEncodingName:nil baseURL:nil];
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您必须将 WebViews 委托设置到放置上述委托方法的位置。