我正在建设一个mac应用程序,并希望能够包括浏览网页和下载文件的能力,从网站使用标准的下载系统,如你所看到的使用safari。
此时,当我点击应用程序中.zip或.nzb的链接时,它什么也不做!有没有一种方法可以从应用程序中允许这样做?
提前感谢您的帮助:)
发布于 2012-02-02 07:18:33
Safari中的下载管理器是由Safari实现的,而不是由WebKit实现的,因此您不会“免费”获得该功能,只有构建它的工具。
为了能够下载文件,您需要指定一个对象作为WebView的WebPolicyDelegate并实现webView:decidePolicyForMIMEType:request:frame:decisionListener:委托方法。
在该方法中,必须对作为decisionlistener参数传递给该方法的对象调用其中一个WebPolicyDecisionListener协议方法。三种WebPolicyDecisionListener协议方法是ignore、use或download。对于要下载的任何MIME类型,必须对作为listener参数传递的对象调用download:
- (void)webView:(WebView *)webView
decidePolicyForMIMEType:(NSString *)type
request:(NSURLRequest *)request
frame:(WebFrame *)frame
decisionListener:(id < WebPolicyDecisionListener >)listener
{
if([type isEqualToString:@"application/zip"])
{
[listener download];
}
//just ignore all other types; the default behaviour will be used
}然后,您需要分配一个对象作为WebView的下载委托。将向此对象发送所有NSURLDownloadDelegate协议消息以及WebDownload委托消息。您可以使用这些消息来选择下载文件的位置,以及实现一个类似Safari的下载管理器UI。
发布于 2012-02-01 19:57:08
我不假思索地认为,您可以实现WebView的委托来检测用户单击链接的时间-然后检查扩展名,如果不是html/php/任何形式,则自己手动下载文件
以下是一个问题(和答案)的链接,了解如何捕获链接按下:
Cocoa WebKit/WebView delegate for location change? (User clicked link, javascript action, etc)
发布于 2016-07-28 08:01:54
另一种选择是在外部浏览器中打开链接。该文件将使用外部浏览器的下载管理器进行下载。
使用XCode 7.3的Swift 2.2中的示例代码:
func webView(webView: WebView!, decidePolicyForNavigationAction actionInformation: [NSObject : AnyObject]!, request: NSURLRequest!, frame: WebFrame!, decisionListener listener: WebPolicyDecisionListener!) {
let url = request.URL!.absoluteString
if url.hasSuffix(".zip") || url.hasSuffix(".nzb") {
listener.ignore()
NSWorkspace.sharedWorkspace().openURL(request.URL!)
} else {
listener.use()
}
}PS。上面的方法来自WebPolicyDelegate。
https://stackoverflow.com/questions/9095245
复制相似问题