5

是否可以在不修改应用程序以支持新的 MIME 类型或像 Sparrow 那样的未知 MIME 类型的情况下从 web 视图中下载和添加存折?

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

这可能是苹果的一些奇怪策略吗?不允许此 MIME 类型从 web 视图正确打开?

4

2 回答 2

3

我最好的选择是它UIWebView无法处理 Passbook 通行证。UIWebViewDelegate但是,您可以尝试在方法中捕获下载-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

我的意思是你必须自己处理这部分,因为我使用的http://passkit.com/samples/不会返回一个结束的 url,pkpass因此它完全取决于你如何请求存折文件。

如果您确实包含.pkpass扩展名,则可以在请求中检查扩展名。

如果您知道存折文件的 URL 类型,您可以在此处编写自己的下载代码并通过存折 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];
    }
}

但这只是非常糟糕的编码。

于 2012-11-30T15:26:34.817 回答
3

好的,与 WWDC 的工程师交谈,这是 UIWebView 中的一个已知错误,但 Apple 可能不会修复它,因为他们鼓励人们采用新的 SFSafariViewController。如果您需要支持 iOS 6-8,我们确实想出了一个 hack 来修复它:

  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];
                }
            }
        }];
    }
    

对于应该支持的内容来说,这是一个可怕的黑客攻击,但无论扩展名如何,它都可以工作,并且应该支持重定向。如果想堆上bug train,可以参考radar://21314226

于 2015-06-10T22:58:30.533 回答