Android WebView 保持登入問題

來源:互聯網
上載者:User

標籤:none   分享圖片   setcookie   setting   parse   出現   tar   第三方   ttext   

最近有個需求是這樣的:在應用中添加一個商城,商城的實現是H5(包括登入)。需要將這個H5嵌到原生應用中,並在原生代碼中添加支付功能。

接到這個需求的時候,想這不是很簡單麼,用WebView載入這個頁面,通過Js回調原生方法,然後調用第三方支付,完工。

然而到實際開發的時候,問題就出現了。

首先的問題是:

      1.在商城中,點擊了一個商品,然後購買。

       2.此時沒有登入,會跳到登入介面。

       3.沒關係,那就登入一下。

       4.登入完後,再次點擊這個商品,然後去購買。

       5.然後問題就出現了,前面不是登入過了嗎?怎麼還跳到登入介面了?

分析:

       一開始以為是H5寫的不對,然而我用瀏覽器開啟的時候,是好的,跳轉也正常,所以,還是WebView設定的有問題。

       一通百度之後,初步斷定是Cookie同步的問題,但是網路這一塊一直不太懂,當下也沒時間細細研究,所以就照著百度所得之後一步步嘗試。下面是我的解決方案。

解決方案:

  • 初始化WebView
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

 

  • 在loadUrl(url)前,同步Cookie
    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 保持登入問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.