2013-11-29 2 views
5

У меня есть приложение, которое использует пользовательские схемы в Android WebViewClient shouldInterceptRequest(WebView view, String url) и shouldOverrideUrlLoading(WebView view, String url) для перехвата запросов в веб-приложении и использования собственной библиотеки для извлечения ресурсов из других источников в shouldInterceptRequest. Это отлично работает до Android 4.4 KitKat, где Google внес некоторые важные изменения в компонент webView.shouldInterceptRequest на Android 4.4 KitKat

http://developer.android.com/guide/webapps/migrating.html#URLs

Теперь URL получил в shouldOverrideUrlLoading вдруг становится недействительным, глядя, как это; заказ схема: ////my.pathname.com/. Сначала я подозревал, что дополнительные косые черты были вызваны тем, что Android не думал, что URL-адрес был действительным RFC3986, но в серии извлечения ресурсов (css, js, images) URL-адрес начинается правильно и внезапно переходит в неверный формат. WebView в Android 4.3 правильно сохранил URL-адрес в качестве настраиваемой схемы: //my.pathname.com/. Похоже, что базовый url внезапно меняется на '/' вместо 'my.pathname.com'.

Затем мое внимание изменилось к тому, что WebView 4.4 Руководства по миграции говорит о:

Если вы вызываете методы WebView из любого другого потока, чем поток пользовательского интерфейса вашего приложения, это может привести к неожиданным результатам. http://developer.android.com/guide/webapps/migrating.html#Threads

Это также может быть то, что я испытываю, но я до сих пор не придумали решение, где я могу использовать runOnUiThread() для извлечения данных с нативным API и вернуть его в WebView внутри shouldInterceptRequest. Кто-нибудь испытал что-то подобное?

Вот упрощенная версия моего shouldInterceptRequest кода:

@Override 
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) { 
     if (urlStartsWithKnownPrefix(url)) { 
      UrlFetchResult fetchRes = api.fetchUrl(url); 
      String charset = "utf-8"; 
      String mime = fetchRes.getMimetype(); 
      WebResourceResponse res = new WebResourceResponse(mime, charset, new ByteArrayInputStream(fetchRes.getResult())); 
      return res; 
     } 
     return null; 
    } 
+0

Как вы ссылаетесь на содержимое своего HTML? Какова ожидаемая и фактическая ценность URL-адреса, который вы получаете? – ksasq

+0

Ресурсы ссылаются относительно, например; '', и они действительно отображаются и отображаются правильно, но когда я смотрю на DOM, базовый url - это настраиваемая схема: ////my.pathname.com/, который недействителен. Ожидаемый URL - это обычная схема: //my.pathname.com/, которая действительна. – MartinR

+0

Как установить базовый URL-адрес и пользовательскую схему? – ksasq

ответ

2

Вы используете JQuery-Mobile случайно? Это звучит очень похоже на: How can I use relative urls in ajax requests within trigger.io apps on Android 4.4 (kitkat)?

+0

Вы абсолютно правы.В итоге я создал патч для jQuery Mobile, подобный этому запросу: https://github.com/jquery/jquery-mobile/pull/6811/files. Также была включена проверка на наличие лишних слэшей в методе Android shouldInterceptRequest. Это определенно не прекрасное решение, но это единственное, что работает прямо сейчас. – MartinR

+0

Каково решение, если пользовательский протокол Ex: _customProtocol: // _ –