2017-12-09 142 views
13

Od czasu wydania Chrome 63 na Androida, 6 grudnia 2017 r. Napotkałem problem z aplikacją Android firmy Cordova. Ta aplikacja obejmuje ramki IFrame, które pozwalają użytkownikom nawigować po częściach witryny eCommerce mojej firmy z poziomu aplikacji.Aplikacja Android Cordova z ramkami IFrames Chrome 63 Brak nagłówków żądań Pliki cookie

Nawigacja między stronami załadowanymi do ramki IFrames nie powoduje już wysyłania informacji o plikach cookie w nagłówkach zgłoszeń.

Informacje, takie jak identyfikatory sesji przechowywane w pliku cookie, nie są przekazywane do następnej strony, co z kolei powoduje, że następna strona rozpoczyna zupełnie nową sesję użytkownika!

Co jednak dziwne, wszystkie wywołania AJAX utworzone na stronie w IFrame (np. Aby pobrać liczbę pozycji w koszyku) i żądania zasobów (css js, pliki obrazów itp.) Wysyłają informacje cookie w żądaniu nagłówki dobrze. Identyfikator sesji w tych nagłówkach jest identyczny między stronami, co wskazuje na trwałość sesji.

Pliki cookie są tworzone w porządku i widzę je podczas korzystania z narzędzi programistycznych Chrome w panelu Aplikacje w domenie firm. Po prostu nie są przekazywane do następnej strony.

Doświadczyłem tego problemu na urządzeniu z Androidem 7.1.1. Po wyłączeniu aplikacji Chrome na tym urządzeniu nagłówki żądań plików cookie w ramkach IFrame w aplikacji znów zaczynają działać poprawnie, prawdopodobnie przeglądarka internetowa Cordova nie używa już Chrome, gdy jest wyłączona?

Czy ktoś wie, co może być przyczyną tego problemu? Czy może to być coś związanego z plikami cookie SameSite lub ścisłymi zmianami izolacji witryny lub innymi zmianami związanymi z bezpieczeństwem w Chrome 63?

Problem pojawia się podobny do tego błędu, że Chromium została ustalona października 2016: https://bugs.chromium.org/p/chromium/issues/detail?id=634311

Webview ma jednak ThirdParty ciasteczka włączone w klasie SystemCookieManager biblioteki Cordova (Cordova Androida 6.4.0):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    cookieManager.setAcceptThirdPartyCookies(webView, true);    
} 

Przepraszam, jeśli niczego nie sprecyzowałem wystarczająco jasno. Chętnie udzielę dodatkowych informacji, jeśli ktoś może pomóc w rozwiązaniu tego problemu.

+0

Mamy ten sam problem, dziękuję za opis. Wygląda na to, że korzystanie z elementu iframe w Cordowie nie jest odporne na działanie nowych technologii, nadal będzie podlegać ograniczeniom bezpieczeństwa. Szukamy możliwości użycia programu themeablebrowser lub inappbrowser cordova. – Jerem

+0

To nie wydaje się być sprawą Chrome vs System WebView, ale czysto związaną z wersją. Na moim telefonie mam system WebView v63 i Chrome v62. Przy tym ustawieniu aplikacja będzie cierpieć z powodu opisanego problemu. Po usunięciu aktualizacji systemu WebView problem zniknie. Nie mam sposobu, aby zmusić Chrome do aktualizacji do wersji 63, v62 to najnowsza wersja, którą mogę zainstalować. Nie mogę więc powiedzieć na pewno, który silnik/wersja jest używana w tym przypadku. –

Odpowiedz

2

Oto sposób na rozmowę bez Cordova. Korzysta z http://httpbin.org/cookies/set?k2=v2&k1=v1 do testowania plików cookie. W przypadku Android System WebView w. 63 pliki cookie nie są wysyłane. W poprzednich wersjach są one wysyłane. Mam nadzieję, że pomoże znaleźć odpowiedź na to pytanie. Tu jest link do pełnego projektu Android: https://www.dropbox.com/s/s53wfy71uou11rh/test-webview.zip?dl=0

MainActivity.java

package com.example.mihai.twv; 

import android.os.Build; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.webkit.CookieManager; 
import android.webkit.WebView; 

import java.io.InputStream; 

public class MainActivity extends AppCompatActivity { 

    WebView mWebView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initWebView(); 
     loadWebView(); 
    } 

    private void initWebView() { 
     mWebView = (WebView) findViewById(R.id.webView); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      WebView.setWebContentsDebuggingEnabled(true); 
     } 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); 
     } 
    } 

    private void loadWebView() { 
     String url = "http://httpbin.org"; 
     String html = getLocalFileContents("html/main.html"); 
     mWebView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null); 
    } 

    private String getLocalFileContents(String filepath) { 
     String response = ""; 

     try { 
      InputStream is = getAssets().open(filepath); 
      int size = is.available(); 

      StringBuilder builder = new StringBuilder(); 

      byte[] buffer = new byte[size]; 
      while (is.read(buffer) != -1) { 
       builder.append(new String(buffer, "UTF-8")); 
      } 
      is.close(); 
      response = builder.toString(); 
     } catch (Exception e) { 
     } 
     return response; 
    } 
} 

html/main.html (aktywów Folder)

<html> 
<head> 
    <base href="file:///android_asset/html/"> 
    <link type="text/css" rel="stylesheet" href="../css/main.css" /> 
</head> 
<body> 
    <iframe src="http://httpbin.org/cookies/set?k1=v1&k2=v2" frameborder="0"></iframe> 
</body> 

css/main.css (w folderze Assets)

html, 
body, 
iframe { 
    width: 100%; 
    height: 100%; 
} 
+0

Wydaje się to naprawić w aktualizacji systemu Android WebView 63.0.3239.107. Testowany na Samsung J5 (SM-J500H) z Androidem 6.0.1 – mihai1990

9

Ten błąd został złożony i skierowana in the Chromium Bug tracker. Według twórców Chromium, nic nie możemy zrobić ze strony App.

+3

Ten błąd został naprawiony w najnowszej wersji Chrome/Android Webview (wersja 63.0.3239.111). Problemy, które wystąpiły w naszych aplikacjach, zostały rozwiązane. – user1491571

0

To był błąd w Chrome, został naprawiony. Zaktualizowałem Chrome ponownie i działa teraz dobrze na moim urządzeniu.

Czego możemy się nauczyć z tego, że Cordova zależy od innych aplikacji ...