標籤:none 分享圖片 setcookie setting parse 出現 tar 第三方 ttext
最近有個需求是這樣的:在應用中添加一個商城,商城的實現是H5(包括登入)。需要將這個H5嵌到原生應用中,並在原生代碼中添加支付功能。
接到這個需求的時候,想這不是很簡單麼,用WebView載入這個頁面,通過Js回調原生方法,然後調用第三方支付,完工。
然而到實際開發的時候,問題就出現了。
首先的問題是:
1.在商城中,點擊了一個商品,然後購買。
2.此時沒有登入,會跳到登入介面。
3.沒關係,那就登入一下。
4.登入完後,再次點擊這個商品,然後去購買。
5.然後問題就出現了,前面不是登入過了嗎?怎麼還跳到登入介面了?
分析:
一開始以為是H5寫的不對,然而我用瀏覽器開啟的時候,是好的,跳轉也正常,所以,還是WebView設定的有問題。
一通百度之後,初步斷定是Cookie同步的問題,但是網路這一塊一直不太懂,當下也沒時間細細研究,所以就照著百度所得之後一步步嘗試。下面是我的解決方案。
解決方案:
private void initWebView() { WebSettings webSettings = webview.getSettings(); // 設定編碼 webSettings.setDefaultTextEncodingName("utf-8"); webSettings.setTextZoom(100); //自適應螢幕 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); webSettings.setLoadWithOverviewMode(true); // 支援js webSettings.setJavaScriptEnabled(true); // 設定本地調用對象及其介面 jsBridge = new JavaScriptBridge(getActivity(), webview); webview.addJavascriptInterface(jsBridge, "Native"); CookieManager mCookieManager = CookieManager.getInstance(); mCookieManager.setAcceptCookie(true); mCookieManager.setAcceptThirdPartyCookies(webview, true); webview.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onPageFinished(WebView view, String url) { // //擷取webview裡面的cookie資訊 CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); String cookieStr = cookieManager.getCookie(url); saveCookies(cookieStr); progressBar.setVisibility(View.GONE); } @Override public void onReceivedError(WebView view, int errorCode, String description, final String failingUrl) { } public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("http") || url.startsWith("https")) { if (url.startsWith("http://shop.yinm")) { //這個WebView是通用的,只對這個商城的連結做Cookie操作。 syncCookie(getContext(), url); } view.loadUrl(url); return false; } else { //其他的URL則會開啟一個Acitity然後去調用原生APP try { Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(in); view.stopLoading(); }catch (Exception e) { e.printStackTrace(); } return true; } } }); }
View Code
- 在onPageFinished的時候,儲存Cookie
private void saveCookies(String cookieString) { sp.edit().putString("cook", cookieString).apply(); }
View Code
private void syncCookie(Context context, String url){ try{ CookieSyncManager.createInstance(context); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); cookieManager.removeSessionCookie();// 移除 //log String oldCookie = cookieManager.getCookie(url); if(oldCookie != null){ android.util.Log.i("zxy", "getCookie oldCookie " + oldCookie); } String cookie = sp.getString("cook", ""); String[] cookies = cookie.split(";"); if (!TextUtils.isEmpty(cookie)) { for (String cook : cookies) { cookieManager.setCookie(url, cook.trim()); //一定要一個一個set, 如果是拼接的話,設定不成功。 } } //最後一定要調用 CookieSyncManager.getInstance().sync(); //log String newCookie = cookieManager.getCookie(url); if(newCookie != null){ android.util.Log.i("zxy", "getCookie newCookie " + newCookie); } }catch(Exception e){ android.util.Log.i("zxy", "getCookie failed" + e.toString()); } }
View Code
這樣,就可以實現Cookie同步了。
(網路這一塊,找個時間要好好補補)
Android WebView 保持登入問題