Objective c UIWebView委托获取MIME类型

Objective c UIWebView委托获取MIME类型,objective-c,ios6,uiwebview,nsurlconnection,Objective C,Ios6,Uiwebview,Nsurlconnection,UIWebView不自动支持处理Passbook.pkpass文件 在这种情况下,苹果建议通过UIWebViewDelegate方法实现一个检查,以嗅出MIME类型并相应地进行处理 要使用UIWebView添加过程,请实现适当的 UIWebViewDelegate方法,用于标识视图何时使用 应用程序的MIME类型/vnd.apple.pkpass 但是,在中找不到能够提供MIME类型的任何内容 我可以使用NSURLConnection委托直接成功下载和处理文件,没有问题,但我希望实现的是,如果用

UIWebView不自动支持处理Passbook.pkpass文件

在这种情况下,苹果建议通过UIWebViewDelegate方法实现一个检查,以嗅出MIME类型并相应地进行处理

要使用UIWebView添加过程,请实现适当的 UIWebViewDelegate方法,用于标识视图何时使用 应用程序的MIME类型/vnd.apple.pkpass

但是,在中找不到能够提供MIME类型的任何内容

我可以使用
NSURLConnection
委托直接成功下载和处理文件,没有问题,但我希望实现的是,如果用户在UIWebView中浏览时单击“添加到存折”按钮,则可以正确处理通行证。由于我不知道链接,而且许多提供商也没有在链接后加上.pkpass扩展名,所以按照苹果的建议检查MIME类型似乎是最好的方法

我尝试添加以下内容

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)newRequest 
                                                 navigationType:(UIWebViewNavigationType)navigationType 
{

   NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:[newRequest URL]];

   // Spoof iOS Safari headers for sites that sniff the User Agent
   [req addValue:@"Mozilla/5.0 (iPhone; CPU iPhone OS 6_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25" forHTTPHeaderField:@"User-Agent"];

   NSURLConnection *conn = [NSURLConnection connectionWithRequest:newRequest delegate:self];

   return YES;
} 
我的
NSURLConnection
委托:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSString *mime = [response MIMEType];

    if ([mime isEqualToString:@"application/vnd.apple.pkpass"] && ![_data length]) {

        _data = nil; // clear any old data
        _data = [[NSMutableData alloc] init];

        [_webPanel stopLoading];
    }
}

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [_data appendData:data];
    NSLog(@"Size: %d", [_data length]);
}

-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{

    if ([_data length]) {

        PKAddPassesViewController  *pkvc = [PassKitAPI  presentPKPassFileFromData:_data];
        pkvc.delegate = self;
        [self presentViewController:pkvc
                           animated:YES
                         completion:nil];
    }
}
直接调用连接时,
NSURLConnection
委托可以正常工作,无需使用
UIWebView
。但是,当我尝试从
UIWebView
委托启动
NSURLConnection
时,密码下载失败,因为只有80%左右的.pkpass被下载(我在_数据变量和内容长度头中得到了随机的字节不匹配)

所以,我的问题是:

  • 有没有更简单的方法可以直接从
    UIWebView
    委托方法获取
    MIME
    类型
  • 如果不是,那么我打开并行连接是正确的方法,还是有更好的方法
  • 如果NSURLConnection是一种方法,那么是什么导致它在下载完整文件之前停止
    您可以尝试子类化NSURLProtocol并在那里处理响应信息解析

    - (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy
    
    不要忘记也使用这些挂钩的子资源。

    只需使用js即可

    let contentType = webView.stringByEvaluatingJavaScript(from: "document.contentType;")
    

    虽然这样做有效,但由于每个请求都要下载两次,因此会产生巨大的开销。您的代码也停留在MIME类型上-我的问题是UIWebView不直接支持MIME类型的应用程序/vnd.apple.pkpass,因此我需要通过NSURLConnection有条件地(高效地)下载这些文件,而不是不分青红皂白地并行下载所有文件。您能否解释上述两点1)下载两次,2)停止MIME类型。在我的代码中,所有这些代理只调用一次。shouldStartLoadWithRequest、didReceiveResponse、webViewDidStartLoad、webViewDidFinishLoad。当这些委托方法触发时,UIWebView也会下载该文件(但最终会丢弃它,因为它不知道如何本机处理它)。使用NSURLConnection需要对同一资源向服务器发出两个独立的请求(来自UIWebView的原始请求+第二种形式的NSURLConnection)。pkpass文件需要大量CPU才能生成,其重量可达500kb。理想情况下,我应该能够访问原始UIWebView请求中的数据,但错误委托会丢弃这些数据。您找到解决方案了吗?如果是,你能分享一下吗?不,我在WWDC和苹果工程师讨论过,他们告诉我没有解决方案。我有几个关于文档和UIWebView委托的开放bug报告。你找到这个了吗?我将不得不承担这项任务,我希望不必再次手动点击服务器。不幸的是,我再次与WWDC的WebKit团队交谈,他们说他们仍在努力添加对.pkpass捆绑包的本机支持。您能提供一点更详细的方法吗?似乎唯一可以避免双重加载资源的方法是专门使用UIWebview或NSURLConnection,但要做到后者似乎需要做很多工作。在NSURL协议中,每个子资源发出的每个请求都会影响到您。您也可以点击每个响应。您可以根据mainDocumentURL和请求的URL(有时)检查您是否是子资源。响应信息有一个可以查看的MIMEType属性。
    let contentType = webView.stringByEvaluatingJavaScript(from: "document.contentType;")