在UIWebView中检测下载

时间:2009-10-12 15:40:42

标签: objective-c iphone uiwebview

我有一个编程的UIWebView,它用于浏览存储在我服务器上的iPhone风格的网站。在这个网站上,有一些用户可以下载到我的应用程序中的文件链接。现在,我试图通过以下方式检测到:

- (BOOL) webView:(UIWebView *) webView shouldStartLoadWithRequest:(NSURLRequest *) request navigationType:(UIWebViewNavigationType) navigationType
{
    url = [request URL];
    NSString *mimeType = [request valueForHTTPHeaderField:@"Content-Type"];
    NSLog(@"Content-type: %@", mimeType);
    if(mimeType == @"application/zip" || mimeType == @"application/x-zip" || mimeType == @"application/octet-stream")
    {
        NSLog(@"Downloading file!");
        [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:@"/tmp/file.ipa"];
        return NO;
    }
    return YES;
}

但是,调用此方法时,内容类型标题几乎总是(null),因此我无法下载文件。

你会如何正确地做到这一点?

3 个答案:

答案 0 :(得分:3)

您正在尝试从尚未制作的NSURLRequest中检测Content-Type。在使用NSURLConnection发出请求之前,您不会知道Content-Type。在这种情况下,我可能只是查看URL路径的文件扩展名。

答案 1 :(得分:0)

所以这就是问题所在:UIWebView不会下载任何无法显示的内容,也不知道如何显示ZIP文件。在填写Content-Type之前,它总是会失败。

那么,该怎么办?我不知道您的服务器端应用程序是否比iPhone运行更多,但您可以使用myapplication://example.com/stuff/yourhexurlgoeshere等链接注册自定义URL方案。您可以为myapplication方案创建自定义URL处理程序。几秒钟的谷歌搜索产生this site,解释了如何做到这一点。

这还有一个额外的好处,因为如果您通过电子邮件将这样的链接发送给其他用户,他们可以在Mail中点击它并在您的应用程序中打开它。

答案 2 :(得分:0)

---------- Swift 4 + -------

音频/ mp3检测示例 -

第1步:使用委托

class ViewController : WKUIDelegate,WKNavigationDelegate {

第2步:设置WebKit

 func setWebView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        webView.navigationDelegate = self
        view = webView

        let myURL = URL(string: "https://www.bossmobi.guru/files/download/type/320/id/197255")//your audio url
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }

第3步:从webkit委托获取音频MIME类型。

 func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        print( #function + "url is \(String(describing: webView.url))"  + "Mimetype" + "\(navigationResponse.response.mimeType ?? "NotAvailable")")
        if let _ = navigationResponse.response.mimeType?.range(of: "audio/mpeg") {
            print("MP3 is audio url \(String(describing: webView.url))")
            webView.stopLoading()
        }
        decisionHandler(.allow)
    }

---------的 ObjC ----------

WKWebView设置

  NSString *urlString = @"https://www.bossmobi.guru/files/download/type/320/id/197255";

    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    WKWebView *_demoWKWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
    _demoWKWebView.navigationDelegate = self;
    _demoWKWebView.UIDelegate = self;
    NSURL *nsurl=[NSURL URLWithString:urlString];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [_demoWKWebView loadRequest:nsrequest];
    [self.view addSubview:_demoWKWebView];

WKWebView委托

-(void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
    //NSLog(@"decidePolicyForNavigation---Response  %@",webView.URL);
    if ([navigationResponse.response.MIMEType isEqualToString:@"audio/mpeg"]) {
        NSLog(@"MP3  audio url is %@",webView.URL);
    }
    decisionHandler(WKNavigationResponsePolicyAllow);
}