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 标头中的字节随机不匹配)。
所以,我的问题:
- 有没有更简单的方法可以
MIME
直接从UIWebView
Delegate 方法中获取类型? - 如果不是,那么我是通过打开并行 NSURLConnection 以正确的方式来解决这个问题,还是有更好的方法?
- 如果一个 NSURLConnection 是要走的路,那么是什么导致它停止下载完整文件?