Pytanie Jaka jest różnica między UIWebView i WKWebView podczas ładowania zasobów lokalnych


Chcę załadować lokalne zasoby za pomocą webView. Zbudowałem demo z UIWebView i WKWebView, aby wykonać test z poniższym kodem.

    let uiWebView = UIWebView(frame: self.view.bounds)
    self.view.addSubview(uiWebView)

    let wkWebView = WKWebView(frame:CGRect(x: 0, y: 400, width: 500, height: 500))
    self.view.addSubview(wkWebView)

    let path = Bundle.main.path(forResource:"1", ofType: "png")

    guard let realPath = path else {
        return
    }

    let url = URL(string: realPath)
    let fileUrl = URL(fileURLWithPath: realPath)

    if let realUrl = url {
        uiWebView.loadRequest(URLRequest(url:realUrl))
        wkWebView.load(URLRequest(url:realUrl))
    }


  // uiWebView.loadRequest(URLRequest(url:fileUrl))
  // wkWebView.load(URLRequest(url:fileUrl))

UiWebView może załadować zasób, ale wkWebView nie może. Ale jeśli skorzystam

  uiWebView.loadRequest(URLRequest(url:fileUrl))
  wkWebView.load(URLRequest(url:fileUrl))

zarówno uiWebView, jak i wkWebView mogą działać dobrze. Jestem zdezorientowany i każdy może mi to wyjaśnić: Nie powinienem używać adresu URL (ciąg: realPath) dla zasobu lokalnego? Ale dlaczego UIWebView może z niego korzystać?


18
2017-12-14 03:39


pochodzenie


Szukałem tego. Właśnie to mnie ostatnio frustruje ... - BCI


Odpowiedzi:


Kilka punktów:

  1. jabłko poleca z którego korzystasz WKWebview dla systemu iOS 8 i nowszych. Unikałbym pisania nowego kodu UIWebView.

W aplikacjach, które działają w systemie iOS 8 i nowszych wersjach, użyj opcji WKWebView klasa zamiast używać UIWebView. Dodatkowo rozważ ustawienie ustawienia WKPreferences własność javaScriptEnabled do false jeśli renderujesz pliki, które nie powinny uruchamiać JavaScript.

  1. Apple stara się odejść ścieżka i zamiast tego chce użyć URI nawet dla plików lokalnych. Zalecają, aby NIE używać /path/to/file.png I użyć file:///path/to/file.png zamiast.

Dlaczego jeden adres URL działa, a drugi nie, zróbmy minimalny przykład:

let realPath = "/path/to/file.png"
let url = URL(string: realPath)               // /path/to/file.png
let fileUrl = URL(fileURLWithPath: realPath)  // file:///path/to/file.png
  • url nie zapewnia schematu (protokół a.k.a). Powinien być używany tylko w połączeniu z innym adresem URL, aby podać bezwzględny adres zasobu, do którego próbujesz dotrzeć. UIWebView Obsługuje go ze względu na kompatybilność wsteczną, ale Apple zdecydowało się rozpocząć czyszczenie WKWebView.
  • fileURL ma schemat (file://), który mówi, że zasób znajduje się w lokalnym systemie plików. Inne popularne systemy to http, https, ftpitp. Jest to kompletny adres do zasobu, więc oba widoki wiedzą, jak go rozwiązać.

21
2017-12-14 05:01



Gdzie jest napisane, że UIWebView jest przestarzałe? - jjxtra
developer.apple.com/documentation/uikit/uiwebview - Code Different
Nie mówi "przestarzałe", po prostu "używaj klasy WKWebView zamiast używać UIWebView". Kod źródłowy nie został oznaczony jako przestarzały lub z ostrzeżeniem. Nie podają więcej szczegółów, więc nie jest dla mnie jasne. - Ricardo
nie ma o czym wspominać UIWebView odwołanie do klasy do daty, ale Właśnie zobaczyłem w Xcode 9 beta 6, że w miejscu, gdzie wszystkie elementy interfejsu UI w edytorze storyboard, UIWebView przestarzałe. - Suryakant
Wyzwanie polega na tym, że wykrywacze danych w WKWebView wydają się obsługiwać tylko iOS 10+, co jest problemem dla naszej bazy użytkowników. Czy ktoś ma sposób trzymać się WKWebView i wykrywać linki w iOS 9? - Rob Bonner


Może to być spowodowane względami bezpieczeństwa lub po prostu WKWebView API zostało zaimplementowane.

WKWebView ma określoną metodę instancji do ładowania lokalnych zasobów zwanych loadFileURL(_:allowingReadAccessTo:). Zostało to wprowadzone w iOS 9.

Uwaga

Jeśli kierujesz na system iOS 8.0 lub nowszy, powinieneś go używać WKWebView zamiast UIWebView. Widzieć: https://developer.apple.com/reference/webkit/wkwebview


3
2017-12-14 04:29