在UIWebView中检测下载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在UIWebView中检测下载相关的知识,希望对你有一定的参考价值。

我有一个编程crated 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),因此我永远无法下载文件。

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

答案

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

另一答案

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

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

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

另一答案

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

以上是关于在UIWebView中检测下载的主要内容,如果未能解决你的问题,请参考以下文章

如何检测UIWebView中的单击文件链接?

在 UIWebView 中使用进度条?

如何从UIWebView下载文件并再次打开

检测项中的静态库是否使用UIWebView

如何在 UIWebView 中检测重定向

UIWebview 未检测到链接