2015-04-11 12 views
5

Moja aplikacja ładuje bardzo dużą aplikację internetową wewnątrz UIWebView.WKWebView i NSURLCache do obsługi lokalnych treści

Napisałem rozszerzenie "NSURLCache" LocalCache ".

Rozszerzenie LocalCache przechwytuje moją ładowanie i ładuje wszystkie żądane pliki z lokalnego pakietu aplikacji, który jest zaszyfrowany. Ta logika jest implementowana w metodzie NSURLCache'scachedResponseForRequest. Więc aplikacja serwowane jest w 100% lokalnie:

class LocalCache:NSURLCache { 
    override func cachedResponseForRequest(request: NSURLRequest) -> NSCachedURLResponse? { 
     if (request points to my domain) { 
      get file from bundle 
      decrypt it 
      return local copy 
     } else { 
      return super.cachedResponseForRequest(request) 
     } 
    } 
} 

NSURLCache.setSharedURLCache(LocalCache()); 

Chciałbym portu tę funkcjonalność do WKWebkit. Zastanawiam się, czy istnieje sposób na zaimplementowanie czegoś podobnego, ponieważ, niestety, jak zapewne wiesz, WKWebView nie używa stosu kakao z NSProtocol, NSUrl, NSUrlCache .... sprawiając, że moje obecne podejście jest bezużyteczne.

Czy można coś podobnego osiągnąć za pomocą WkWebView?

Uwaga: Fakt, że moja aplikacja pochodzi ze zdalnego serwera, jest kluczowy dla aplikacji: jeśli po prostu załaduję aplikację lokalnie, tj. file://, jest wiele rzeczy, które nie działają, na przykład, YouTube Filmy, ponieważ youtube api skarży się, że "file://" nie jest zatwierdzonym źródłem. Tak więc szukane rozwiązanie WkWebView musi być powiązane z przechwytywaniem pamięci podręcznej, zamiast wstrzykiwania lokalnego javascriptu.

+1

"WKWebView wysyła żądania i renderuje zawartość poza procesem, co oznacza, że ​​aplikacja nie słyszy żądań, które wysyła." http://stackoverflow.com/a/24208322/23649 – jtbandes

+1

@rupps czy znalazłeś jakieś rozwiązanie tego? Mam podobny problem. Myślę o próbie [WKUserScript] (https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKUserScript_Ref/#//apple_ref/occ/instm/WKUserScript/initWithSource:injectionTime:forMainFrameOnly :) . – Alex

Odpowiedz

1

Kilka miesięcy temu znalazłem się w bardzo podobnej sytuacji (używając NSURL Protococol/NSURLCache i chcąc przeprowadzić migrację z UIWebView do WKWebView), a to, co zrobiłem, to użyć lokalnego serwera HTTP do obsługi moich plików/żądań (https://github.com/mattstevens/RoutingHTTPServer).

Pomogło mi to również w rozwiązaniu innego problemu związanego z ładowaniem filmów HTML5 na UIWebView, ponieważ niektóre z nich nie zostały przechwycone przez UIWebView/NSURLCache.

+0

Witam, to fajny pomysł, na jakiś czas przestałem rozwijać IOS, ale w końcu znowu się do niego dostanę. O tym rozwiązaniu może być problem z tym, że domena aplikacji będzie lokalna, a niektóre usługi, których używam, odmawiają dostępu do swojego interfejsu API, jeśli żądanie nie pochodzi z aplikacji uruchomionej na hoście. Dlatego inne rozwiązanie było całkiem fajne, WebView pomyślał, że pochodzi z internetu! – rupps

+0

Poza tym, nie wiem, czy to się zmieniło od tego czasu, ale trochę rozczarowałem się rzekomym "wzrostem wydajności" obiecanym przez WkWebView. Prowadzę dość wymagającą aplikację i powiedziałbym, że wydajność jest prawie taka sama! – rupps

+0

Mimo że jedną z moich motywacji do migracji było rzekome "zwiększenie wydajności", moim głównym zmartwieniem było to, że UIWebView jest przestarzałe i obawiałem się, że może przestać działać lub nawet zostać usunięte w przyszłych wersjach. Nie ma też heurystyki, która odróżniałaby długie stuknięcia od podwójnych stuknięć (więc jeśli nie użyjesz bibliotek JS, aby obejść to, zawsze dostajesz to paskudne 300ms opóźnienie na dotknięciach), które z tego, co przeczytałem WKWebView już ma. –

Powiązane problemy