5

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

在本技术说明中,Apple 建议通过 UIWebViewDelegate 方法实施检查,以检测 MIME 类型并进行相应处理。

要使用 UIWebView 添加通道,请实现适当的 UIWebViewDelegate 方法来识别视图何时加载 MIME 类型为 application/vnd.apple.pkpass 的数据

但是,我在UIWebView 委托协议参考中找不到任何能够提供 MIME 类型的内容。

NSURLConnection我可以毫无问题地直接使用委托成功下载和处理文件,但我希望实现的是,如果用户在 UIWebView 中浏览时单击“添加到存折”按钮,则可以正确处理通行证。由于我不知道该链接,并且许多提供商不使用 .pkpass 扩展名为其链接添加后缀,因此遵循 Apple 的检查 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. 但是,当我尝试NSURLConnection从代理启动时UIWebView,通行证下载失败,因为只有 80% 左右的 .pkpass 正在被下载(我得到 _data 变量和 Content-Length 标头中的字节随机不匹配)。

所以,我的问题:

  1. 有没有更简单的方法可以MIME直接从UIWebViewDelegate 方法中获取类型?
  2. 如果不是,那么我是通过打开并行 NSURLConnection 以正确的方式来解决这个问题,还是有更好的方法?
  3. 如果一个 NSURLConnection 是要走的路,那么是什么导致它停止下载完整文件?
4

3 回答 3

2

只用js

let contentType = webView.stringByEvaluatingJavaScript(from: "document.contentType;")
于 2018-02-23T13:22:43.717 回答
0

您可以尝试继承 NSURLProtocol 并在那里处理响应信息解析。

看着

- (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy

不要忘记也使用这些钩子的子资源。

于 2013-10-07T17:59:56.473 回答
0
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {

    NSURL *url = request.URL;
    NSURLRequest *req  = [NSURLRequest requestWithURL:url];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:req delegate:self];
    [conn start];
    return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    NSString *mime = [response MIMEType];
    NSLog(@"%@",mime);

}
于 2013-09-08T01:25:15.240 回答