2010-04-02 36 views
34

Tôi có một ứng dụng trên appspot hoạt động tốt thông qua trình duyệt thông thường, tuy nhiên khi được sử dụng thông qua Android WebView, ứng dụng này không thể đặt và đọc cookie. Tôi không cố gắng lấy cookie "bên ngoài" ứng dụng web này BTW, một khi URL được WebView truy cập, tất cả các xử lý, id, v.v ... có thể ở đó, tất cả những gì tôi cần là quản lý phiên bên trong ứng dụng đó. Màn hình đầu tiên cũng tải tốt, vì vậy tôi biết tương tác máy chủ WebView + không bị hỏng.WebView và Cookie trên Android

Tôi đã xem lớp WebSettings, không có cuộc gọi nào giống như setEnableCookies.

tôi url tải như thế này:

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    WebView webview = new WebView(this); 
    setContentView(webview);  
    webview.loadUrl([MY URL]); 
    } 
    .. 
} 

Bất kỳ ý tưởng?

+2

Bạn có chắc chắn 100% nó không liên quan đến JavaScript bị tắt theo mặc định không? –

+2

tôi chỉ cần kiểm tra, nó không phải. Cảm ơn các đầu vào. –

Trả lời

32

tôi đã tìm ra những gì đang xảy ra.

Khi tôi tải một trang thông qua hành động phía máy chủ (truy cập url) và xem html được trả về từ hành động đó bên trong Webview, trang/trang đầu tiên chạy bên trong Chế độ xem web đó. Tuy nhiên, khi bạn nhấp vào bất kỳ liên kết nào là các lệnh hành động trong ứng dụng web của bạn, những hành động này bắt đầu một trình duyệt mới. Đó là lý do tại sao thông tin cookie bị mất vì thông tin cookie đầu tiên bạn đặt cho Webview đã biến mất, chúng tôi có một chương trình riêng biệt tại đây.

Bạn phải chặn các nhấp chuột trên Webview để duyệt web không bao giờ rời khỏi ứng dụng, mọi thứ vẫn nằm trong cùng một Webview.

WebView webview = new WebView(this);  
    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
     view.loadUrl(url); //this is controversial - see comments and other answers 
     return true; 
     } 
    });     
    setContentView(webview);  
    webview.loadUrl([MY URL]); 

Điều này khắc phục được sự cố.

+33

Thực ra khi ghi đè 'shouldOverrideUrlLoading' để làm cho' WebView' của bạn xử lý tất cả các liên kết URL, nó chỉ đơn giản là 'return false'. Không cần 'view.loadUrl (url);'. Trả về true thực sự có nghĩa là bạn ** muốn ** hệ thống ghi đè lên quá trình xử lý (có thể để khởi chạy trình duyệt). Vì vậy, nếu bạn muốn các liên kết mở trong chế độ xem web của bạn, chỉ cần trả về false. Nguồn: http://developer.android.com/guide/webapps/webview.html#HandlingNavigation –

+3

Sai. Sai rồi. Sai rồi. Turbo là đúng: bạn hoàn toàn không nên gọi view.loadUrl() trong cuộc gọi này trở lại. –

+4

Đúng hay sai, bên thứ ba không nên thực hiện các thay đổi cơ bản đối với mã của câu trả lời. Đăng câu trả lời của riêng bạn hoặc upvote một bình luận quan trọng nếu bạn đồng ý với nó. –

38

Từ Android documentation:

Các CookieSyncManager được sử dụng để đồng bộ hóa trình duyệt lưu trữ cookie giữa RAM và lưu trữ vĩnh viễn. Để có được hiệu suất tốt nhất, cookie trình duyệt được lưu trong RAM. Một chuỗi riêng biệt lưu cookie giữa, được điều khiển bởi bộ hẹn giờ.

Để sử dụng CookieSyncManager, ứng dụng máy chủ có gọi sau khi ứng dụng bắt đầu:

CookieSyncManager.createInstance(context) 

Để thiết lập cho đồng bộ, ứng dụng máy chủ có gọi

CookieSyncManager.getInstance().startSync() 

trong Activity.onResume() và gọi

CookieSyncManager.getInstance().stopSync() 

trong Activity.onPause().

Để có được đồng bộ hóa ngay lập tức thay vì chờ đợi cho bộ đếm thời gian để kích hoạt, các máy chủ có thể gọi

CookieSyncManager.getInstance().sync() 

Khoảng cách đồng bộ là 5 phút, do đó bạn sẽ muốn để buộc đồng bộ bằng tay dù sao, ví dụ trong onPageFinished (WebView, Chuỗi). Lưu ý rằng ngay cả đồng bộ hóa() xảy ra không đồng bộ, do đó, không làm điều đó giống như hoạt động của bạn đang tắt.

Cuối cùng cái gì đó như thế này nên làm việc:

// use cookies to remember a logged in status 
CookieSyncManager.createInstance(this); 
CookieSyncManager.getInstance().startSync(); 
WebView webview = new WebView(this); 
webview.getSettings().setJavaScriptEnabled(true); 
setContentView(webview);  
webview.loadUrl([MY URL]); 
+0

Đã cố gắng điều này, nhưng tôi không cố gắng lấy cookie ra khỏi chế độ xem web. Cookie có thể biến mất giữa hai lần tải Webview riêng biệt của cuộc gọi Url, điều đó tốt. Vấn đề của tôi là các cookie không hoạt động "bên trong" cùng một phiên. –

+0

Kiểm tra cũng điều này: http://stackoverflow.com/questions/1652850/android-webview-cookie-problem – Pentium10

+4

Ngoài ra, bạn cần phải gọi \t \t \t CookieManager.setAcceptFileSchemeCookies (true) khi Build.VERSION.SDK_INT> = 12, nếu bạn đang sử dụng WebView để tham chiếu các tài sản được lưu trữ trên hệ thống tệp cục bộ. Cuộc gọi này phải là TRƯỚC KHI khởi tạo phiên bản đầu tiên của CookieSyncManager hoặc CookieManager. –

7

Vấn đề của tôi là cookie không hoạt động "trong" cùng một phiên. -

Burak: Tôi có cùng một vấn đề. Việc bật cookie đã khắc phục sự cố.

CookieManager.getInstance().setAcceptCookie(true); 
+0

Hi Lucifer Tôi đã thử điều này nhưng tôi không thể lưu trữ các chi tiết thư và mật khẩu trong cookie. Webview có lưu trữ chi tiết hay không? hãy giúp tôi. Khi tôi nhập id và pwd lần đầu tiên, các chi tiết này sẽ được lưu, khi tôi sẽ đăng nhập với cùng userid và pwd, những cookie đó sẽ được lưu trữ trong cookie và sẽ được hiển thị và sau đó tôi phải chọn id đó. Có thể trong webview để lưu trữ chi tiết trong đầu bếp hay không? Cảm ơn và kính trọng trước. –

+0

tôi cũng đã theo liên kết này http://stackoverflow.com/questions/5404274/make-android-webview-not-store-cookies-or-passwords –

+0

Đề xuất này khắc phục sự cố của tôi với cookie bị mất giữa lần khởi động lại ứng dụng trên Android 2.2.1 – zasadnyy

1

CookieManager.getInstance().setAcceptCookie(true); Thông thường nó sẽ có tác dụng nếu webview của bạn đã được khởi tạo

hoặc thử này:

CookieSyncManager.createInstance(this); 
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie(); 
cookieManager.setAcceptCookie(true); 
55

Nếu bạn đang sử dụng Android Lollipop tức SDK 21, sau đó:

CookieManager.getInstance().setAcceptCookie(true); 

sẽ không hoạt động. Bạn cần sử dụng:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

Tôi gặp vấn đề tương tự và dòng trên làm việc như một sự quyến rũ.

+4

Câu trả lời này cần nhiều hơn upvotes – Melllvar

+0

Tôi đang sử dụng minSdk 16, targetsdk 23 và điều này là không làm việc, ngay cả khi tôi sử dụng với setAcceptCookie (true). – kommradHomer

+0

Phiên bản hệ điều hành của thiết bị mà bạn đang thử nghiệm là gì? –

Các vấn đề liên quan