2017-09-28 1 views
1

Meine App navigiert zu einer mobilen Webseite mit einem WKWebView. Was ich suche ist, wie man überprüft, ob die Webseite herunterladbar ist (z.B. eine .csv oder .pdf). Im Moment mache ich etwas Hacky, um die URL zu lesen, aber ich weiß, dass es einen eleganteren Weg geben muss.Wie MIME-Typ einer Seite mit WKWebView lesen?

Ich benutze WKNavigationDelegate - kann jemand einen Einblick geben, wie man feststellen kann, ob eine Seite herunterladbaren Inhalt bietet oder nicht? Oder wie kann ich eine Art "text/csv" lesen?

Bitte lassen Sie mich wissen, wenn ich überhaupt klären kann.

Antwort

1

Sie können dazu das Framework Swime verwenden. Sie verwenden es wie folgt aus:

import Swime 

let path = "/path/to/some-file.jpg" 
let url = URL(fileURLWithPath: path, isDirectory: false) 
let data = try! Data(contentsOf: url) 
let mimeType = Swime.mimeType(data: data) 

mimeType?.type == .jpg // true 
mimeType! // MimeType(mime: "image/jpeg", ext: "jpg", type: .jpg) 

switch mimeType?.type { 
    case .jpg?: 
    .... 
    case .png?: 
    .... 
    case .wmv?: 
    .... 

    case ... 
} 

Hier sind die Liste der verfügbaren MimeTypeExtension:

public enum MimeTypeExtension { 
    case amr 
    case ar 
    case avi 
    case bmp 
    case bz2 
    case cab 
    case cr2 
    case crx 
    case deb 
    case dmg 
    case eot 
    case epub 
    case exe 
    case flac 
    case flif 
    case flv 
    case gif 
    case gz 
    case ico 
    case jpg 
    case jxr 
    case lz 
    case m4a 
    case m4v 
    case mid 
    case mkv 
    case mov 
    case mp3 
    case mp4 
    case mpg 
    case msi 
    case mxf 
    case nes 
    case ogg 
    case opus 
    case otf 
    case pdf 
    case png 
    case ps 
    case psd 
    case rar 
    case rpm 
    case rtf 
    case sevenZ // 7z, Swift does not let us define enum that starts with a digit 
    case sqlite 
    case swf 
    case tar 
    case tif 
    case ttf 
    case wav 
    case webm 
    case webp 
    case wmv 
    case woff 
    case woff2 
    case xpi 
    case xz 
    case z 
    case zip 
} 
+0

Danke für die schnelle Antwort. Es sieht so aus, als sei angenommen, dass die Datei bereits heruntergeladen wurde. Weißt du, wie man eine ähnliche Sache mit einer Seite in einem WKWebView macht? Ich möchte prüfen, ob die Seite herunterladbar ist, und dann den Inhalt herunterladen, wenn ich kann. Ist das sinnvoll? – ArielSD

+0

@ArielSD, okey jetzt bekomme ich es. Checkout [diese] (https://Stackoverflow.com/a/40003309/5576310) Post dann. Ist das was du brauchst? –

+0

Yup - das ist das Nächste, das ich bisher war, danke! – ArielSD

1

Sie sollten die Antwort und bekommen den MIME-Typ vor dem Laden der Seite, mit der webView(_:decidePolicyFor:decisionHandler:) Methode in der Lage zu inspizieren von Ihrem WKNavigationDelegate.

ein Objekt als navigationDelegate für Ihre WKWebView Set und gibt ihm eine Methode wie folgt:

func webView(_ webView: WKWebView, 
     decidePolicyFor navigationResponse: WKNavigationResponse, 
     decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) { 

    if let mimeType = navigationResponse.response.mimeType { 
     // do some thing with the MIME type 
    } else { 
     // response has no MIME type, do some special handling 
    } 
    decisionHandler(.allow) 
} 
+1

Es kann ein Serverproblem an meinem Ende geben, da dies immer noch einen mimeType von "html/text" protokolliert, obwohl die URL eine herunterladbare .csv hat. Es wird durch das Back-End geroutet. – ArielSD

+1

@ArielSD Sie können überprüfen, ob mimeType "html/text" und die URL pathExtension == "csv" https://stackoverflow.com/questions/36231061/wkwebview-open-links-from-certain-domain-in-safari /36231713?s=1|5.4860#36231713 –

+0

Es ist aber gut, wir haben es versucht: Der Link, der auf eine .csv verweist, hat keine solche Erweiterung. – ArielSD