2012-02-01 8 views
9

Sto costruendo un'applicazione per Mac e vorrei in grado di includere la possibilità di navigare in Internet e scaricare file dai siti che utilizzano il sistema di download standard, come si vede quando si utilizza Safari.Come è possibile consentire i download da una WebView utilizzando il sistema di download standard su un'app per Mac?

Nel momento in cui si fa clic su un link a un file .zip o .nzb in app non fa nulla! C'è un modo per consentire questo dall'app?

Grazie in anticipo per qualsiasi aiuto :)

+0

@ (Will Roberts) -I sto cercando la stessa cosa, ma non in grado di scaricare anything.Can mi dici come raggiungere questo obiettivo. Non sono in grado di capire il post di Rob Keniger. –

risposta

0

Fuori della parte superiore della mia testa vorrei che si potrebbe implementare i delegati del WebView di rilevare quando un utente fa clic su un link - quindi controllare l'estensione e se non è html/php/qualunque cosa quindi scaricare manualmente il file da soli

Ecco un link ad una domanda (e risposta) per come catturare il collegamento premendo:

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

+0

Grazie per la risposta, il problema con questo è che i collegamenti che sto cercando di fare non hanno estensione. Esempio: http: //******.com/download.php? Id = 1170176 & nozip = 1 & cat = 36. –

+0

ok allora come si identificano i collegamenti per il download e quali sono per la visualizzazione? – shein

+0

Al momento faccio un controllo che se l'url contiene un certo termine è davvero un collegamento per il download quindi x deve essere fatto con esso! –

10

il download manager in Safar Io sono implementato da Safari, non da WebKit, quindi non ottieni questa funzionalità "gratuitamente", solo gli strumenti per costruirla.

Per poter scaricare i file, è necessario assegnare un oggetto come WebPolicyDelegate di WebView e implementare il metodo delegato webView:decidePolicyForMIMEType:request:frame:decisionListener:.

In questo metodo, è necessario chiamare uno dei metodi del protocollo WebPolicyDecisionListener sull'oggetto passato come parametro decisionlistener al metodo. I tre WebPolicyDecisionListener metodi di protocollo sono ignore, use o download. Per tutti i tipi MIME che si desidera scaricare, è necessario chiamare download sull'oggetto passato come parametro 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 
} 

È quindi necessario assegnare un oggetto come il download delegato del vostro WebView. Questo oggetto verrà inviato tutti i messaggi del protocollo NSURLDownloadDelegate nonché le WebDownload messaggi delegato. È possibile utilizzare questi messaggi per scegliere dove scaricare il file, nonché per implementare un'interfaccia utente di download manager come Safari.

+0

Sembra che tu abbia costruito questo componente. Qualche suggerimento su come "catturare tutti" * i file *? Oppure, come rilevare l'inverso - "pagine web" che dovrebbero essere caricate nel browser? – SG1

+0

O forse questa non è nemmeno la domanda giusta, dato che alcuni file (ad esempio immagini) che l'utente potrebbe voler scaricare a volte e altre volte visualizzare nel browser. Inoltre, ci sono spesso "suggerimenti" nei collegamenti href che l'elemento dovrebbe essere scaricato anziché visualizzato. Hmm ... suona come una sua domanda ... – SG1

+2

[(NSHTTPURLResponse *) [[frame provisionalDataSource] risposta] allHeaderFields] Verificare i valori "Content-Disposition" in questo dizionario. questo ti aiuterà a identificare gli elementi di download. –

0

Un'altra opzione è quella di aprire il link in un browser esterno. E il file verrà scaricato utilizzando il gestore download del browser esterno.

codice di esempio in Swift 2.2 con 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. il metodo sopra viene da WebPolicyDelegate.

Problemi correlati