【问题标题】:Not able to load the file(doc,pdf etc) from url in UIWebview for ios 7无法从 iOS 7 的 UIWebview 中的 url 加载文件(doc、pdf 等)
【发布时间】:2013-10-18 17:13:14
【问题描述】:

我正在 UIWebview 中加载不同的文件类型,如 PDF、Excel、Doc 等。有些文件需要授权,并在header中传递了值。

这在 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"];

错误信息:

Error Domain=WebKitErrorDomain Code=102 "Frame load interrupted" UserInfo=0xd4b5310 {

ios 7 web 视图是否有任何额外的标题字段要传递?

【问题讨论】:

  • 这里有些问题,尝试从 Amazon S3 加载 PDF。我的文件具有正确的 .pdf 扩展名,如此处所述stackoverflow.com/questions/1482736/…
  • 试试这样: NSString *strP = [[NSString alloc] initWithContentsOfFile:htmlFileP encoding:encodingP error:nil]; [self.webviewP loadData:[strP dataUsingEncoding:encodingP] MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:urlP];
  • 我不清楚你在什么时候收到错误。你调用 loadRequest: 在你的 webview 上,传递 self.request 吗?那是错误发生的时候吗?

标签: ios uiwebview ios7


【解决方案1】:

我尝试使用 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];

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

【讨论】:

    【解决方案2】:

    我找到了一个解决方案。不完美,但有效!

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

    NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:256 * 1024 * 1024 diskPath:nil];
    [NSURLCache setSharedURLCache:URLCache];
    

    然后

    - (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];
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      此代码在 iOS 7 中运行良好,附上截图。希望对你有帮助...

      UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 10, 320, 480)];
      
      NSURL *targetURL = [NSURL URLWithString:@"http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/UIWebView_Class.pdf"];
      NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
      [webView loadRequest:request];     
      [self.view addSubview:webView];
      

      【讨论】:

      • 由于某种原因,这不适用于我的文件。我认为我的和 ram 的文件或服务器在某种程度上很特别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多