您可以从IOS应用程序内的UIWebView下载存折优惠券吗?

时间:2012-11-30 14:05:34

标签: ios uiwebview passbook

是否可以从webview中下载和添加存折,而无需修改应用以支持新的MIME类型或Sparrow所做的未知MIME类型?

我有一个带有webview的新闻ios应用程序。在webview中,我显示新闻项目和横幅。当您单击横幅时,我想打开一个.pkpass文件的URL并将其添加到我的存折中。相反,我得到一个FrameLoadInterrupted错误,没有任何可见的事情发生。 如果我打开safari中的url,这个工作正常,chrome,因为本周早些时候(版本23)也会按照预期打开网址。

这可能是Apple的一些奇怪策略吗?不允许从webview中正确打开此MIME类型?

2 个答案:

答案 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,我们确实提出了修复它的方法:

  1. 如果尚未将PassKit框架添加到项目中。

    #import <PassKit/PassKit.h>
    
  2. 为UIWebView设置委托(例如视图控制器启动UIWebView)

    <UIWebViewDelegate>
    
  3. 添加一个类变量来缓存UIWebView请求

    NSURLRequest *_lastRequest;
    
  4. 设置代理

    self.webView.delegate = self;
    
  5. 添加回调以在发生故障时抓取所有请求和缓存

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
        _lastRequest = request;
        return YES;
    }
    
  6. 添加失败回调并重新获取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];
                }
            }
        }];
    }
    
  7. 对于应该支持的内容来说,这是一个可怕的黑客攻击,但它无论扩展程序如何都可以运行,并且应该支持重定向。如果你想在虫子列车上堆积,你可以参考雷达:// 21314226