是否可以从webview中下载和添加存折,而无需修改应用以支持新的MIME类型或Sparrow所做的未知MIME类型?
我有一个带有webview的新闻ios应用程序。在webview中,我显示新闻项目和横幅。当您单击横幅时,我想打开一个.pkpass文件的URL并将其添加到我的存折中。相反,我得到一个FrameLoadInterrupted错误,没有任何可见的事情发生。 如果我打开safari中的url,这个工作正常,chrome,因为本周早些时候(版本23)也会按照预期打开网址。
这可能是Apple的一些奇怪策略吗?不允许从webview中正确打开此MIME类型?
答案 0 :(得分:3)
我最好的选择是UIWebView
无法处理Passbook通行证。但是,您可以尝试使用UIWebViewDelegate
方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
抓住下载内容。
我的意思是说你必须自己处理这部分,因为我使用的http://passkit.com/samples/没有返回结束pkpass
的网址,因此它完全取决于你如何请求存折文件。
如果您使用.pkpass
扩展名,则可以在请求中检查扩展程序。
如果您知道存折文件的URL类型,请在此处编写您自己的下载代码,并通过passbook api将其传递给存折。
似乎没有任何很好的修复,你可以在safari中加载失败的ULR:
- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"Webview: %@", error);
if ([error.domain isEqualToString:@"WebKitErrorDomain"] && error.code == 102) {
NSString *failedURL = [error.userInfo objectForKey:NSURLErrorFailingURLStringErrorKey];
if (failedURL == nil) {
return;
}
NSURL *url = [NSURL URLWithString:failedURL];
[[UIApplication sharedApplication] openURL:url];
}
}
但这只是编码非常糟糕。
答案 1 :(得分:3)
好的,与WWDC的工程师交谈,这是UIWebView中的一个知识错误,但Apple可能无法修复它,因为他们鼓励人们采用新的SFSafariViewController。如果您需要支持iOS 6-8,我们确实提出了修复它的方法:
如果尚未将PassKit框架添加到项目中。
#import <PassKit/PassKit.h>
为UIWebView设置委托(例如视图控制器启动UIWebView)
<UIWebViewDelegate>
添加一个类变量来缓存UIWebView请求
NSURLRequest *_lastRequest;
设置代理
self.webView.delegate = self;
添加回调以在发生故障时抓取所有请求和缓存
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
_lastRequest = request;
return YES;
}
添加失败回调并重新获取URL以查看它是否为传递,如果是,则将传递提供给用户
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
// try to get headers in case of passbook pass
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:_lastRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// check for PKPass
if ([response.MIMEType isEqualToString:@"application/vnd.apple.pkpass"]) {
NSError *error;
PKPass *pass = [[PKPass alloc] initWithData:data error:&error];
if (error) {
NSLog(@"Error: %@", error);
} else {
PKAddPassesViewController *apvc = [[PKAddPassesViewController alloc] initWithPass:pass];
[self presentViewController:apvc animated:YES completion:nil];
}
}
}];
}
对于应该支持的内容来说,这是一个可怕的黑客攻击,但它无论扩展程序如何都可以运行,并且应该支持重定向。如果你想在虫子列车上堆积,你可以参考雷达:// 21314226