首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Mac应用程序上的标准下载系统从WebView进行下载?

如何使用Mac应用程序上的标准下载系统从WebView进行下载?
EN

Stack Overflow用户
提问于 2012-02-01 19:47:07
回答 3查看 5.6K关注 0票数 9

我正在建设一个mac应用程序,并希望能够包括浏览网页和下载文件的能力,从网站使用标准的下载系统,如你所看到的使用safari。

此时,当我点击应用程序中.zip或.nzb的链接时,它什么也不做!有没有一种方法可以从应用程序中允许这样做?

提前感谢您的帮助:)

EN

回答 3

Stack Overflow用户

发布于 2012-02-02 07:18:33

Safari中的下载管理器是由Safari实现的,而不是由WebKit实现的,因此您不会“免费”获得该功能,只有构建它的工具。

为了能够下载文件,您需要指定一个对象作为WebViewWebPolicyDelegate并实现webView:decidePolicyForMIMEType:request:frame:decisionListener:委托方法。

在该方法中,必须对作为decisionlistener参数传递给该方法的对象调用其中一个WebPolicyDecisionListener协议方法。三种WebPolicyDecisionListener协议方法是ignoreusedownload。对于要下载的任何MIME类型,必须对作为listener参数传递的对象调用download

代码语言:javascript
复制
- (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。

票数 11
EN

Stack Overflow用户

发布于 2012-02-01 19:57:08

我不假思索地认为,您可以实现WebView的委托来检测用户单击链接的时间-然后检查扩展名,如果不是html/php/任何形式,则自己手动下载文件

以下是一个问题(和答案)的链接,了解如何捕获链接按下:

Cocoa WebKit/WebView delegate for location change? (User clicked link, javascript action, etc)

票数 0
EN

Stack Overflow用户

发布于 2016-07-28 08:01:54

另一种选择是在外部浏览器中打开链接。该文件将使用外部浏览器的下载管理器进行下载。

使用XCode 7.3的Swift 2.2中的示例代码:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9095245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档