在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中检测下载的主要内容,如果未能解决你的问题,请参考以下文章