Как разрешить загрузку из WebView с использованием стандартной системы загрузки в приложении Mac? - PullRequest
9 голосов
/ 01 февраля 2012

Я создаю приложение для Mac и хотел бы включить возможность просмотра веб-страниц и загрузки файлов с сайтов с использованием стандартной системы загрузок, как вы видите при использовании safari.

В тот момент, когда я нажимаю ссылку на .zip или .nzb в приложении, это ничего не делает! Есть ли способ разрешить это из приложения?

Заранее спасибо за любую помощь:)

Ответы [ 3 ]

11 голосов
/ 02 февраля 2012

Менеджер загрузок в Safari реализован Safari, а не WebKit, поэтому вы не получаете эту функциональность «бесплатно», а только инструменты для ее создания.

Чтобы иметь возможность загружать файлы, необходимо назначить объект как WebPolicyDelegate для WebView и реализовать метод делегата webView:decidePolicyForMIMEType:request:frame:decisionListener:.

В этом методе вы должны вызвать один из методов протокола WebPolicyDecisionListener для объекта, который передается методу в качестве параметра decisionlistener. Три метода протокола WebPolicyDecisionListener: ignore, use или download. Для любых типов MIME, которые вы хотите загрузить, вы должны вызвать 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.

0 голосов
/ 28 июля 2016

Другой вариант - открыть ссылку во внешнем браузере. И файл будет загружен с помощью внешнего менеджера загрузок браузера.

Пример кода в Swift 2.2 с XCode 7.3:

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 голосов
/ 01 февраля 2012

Вдобавок ко всему, я думаю, вы могли бы реализовать делегатов WebView для определения, когда пользователь нажимает на ссылку, - затем проверить расширение и, если это не html / php / что угодно, затем вручную загрузить файл

Вот ссылка на вопрос (и ответ) о том, как захватить ссылку, нажав:

Делегат Cocoa WebKit / WebView для изменения местоположения?(Пользователь щелкнул ссылку, действие JavaScript и т. Д.)

...