如何在Mac应用程序上使用标准下载系统从WebView下载?

Wil*_*rts 9 macos cocoa objective-c osx-lion

我正在构建一个mac应用程序,并希望能够使用标准下载系统来浏览网页和从网站下载文件,就像你在使用safari时看到的那样.

当我在应用程序中单击指向.zip或.nzb的链接时,它什么也没做!有没有办法从应用程序允许这个?

在此先感谢任何帮助:)

Rob*_*ger 11

Safari中的下载管理器由Safari实现,而不是由WebKit实现,因此您无法"免费"获得该功能,只是构建它的工具.

为了能够下载文件,您需要将对象指定WebPolicyDelegate为其中WebView并实现webView:decidePolicyForMIMEType:request:frame:decisionListener:委托方法.

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

- (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
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要将对象指定为您的下载代理WebView.此对象将发送所有NSURLDownloadDelegate协议消息以及WebDownload 委托消息.您可以使用这些消息选择文件的下载位置,以及实现Safari等下载管理器UI.

  • [(NSHTTPURLResponse*)[[frame provisionalDataSource] response] allHeaderFields]检查此词典中的值"Content-Disposition".这将有助于您识别下载项目. (3认同)
  • @ SG1:您应该能够显示使用此代码可以查看的内容:if([[webView class] canShowMIMEType:type])//可能是WebView的子类型{[listener use]; //渲染可以显示的东西} else {[listener download]; //下载其他所有内容} (2认同)

she*_*ein 0

我突然想到你可以实现 WebView 的委托来检测用户何时单击链接 - 然后检查扩展名,如果它不是 html/php/whatever 然后手动下载文件

以下是有关如何捕获按下的链接的问题(和答案)的链接:

Cocoa WebKit/WebView 委托用于位置更改?(用户点击链接、javascript 操作等)

  • 无论如何,您不应该使用文件扩展名。HTTP 标头将包含它返回的数据的 mime 类型,您应该关闭它。 (2认同)