rainbow-android-app

版本兼容

  • 由于Cordova版本的云助理是一款原生与Web结合的Hybrid App,用户账号、密码等数据存储在WebView的LocalStorage中。

  • 为了在原生版本覆盖Cordova版本时保留原用户信息,避免需要用户重新输入,实现自动登录,需要设法获取LocalStorage中的数据。

    • 引入Cordova相关文件,创建CordovaWebView(但界面上不可见),添加JavascriptInterface用于给js提供接口onGetLocalData(String)

      CordovaWebView cordovaWebView = new CordovaWebView(this);
      cordovaWebView.addJavascriptInterface(this, "cordovaWebView");
      
      @JavascriptInterface
      public void onGetLocalData(String account) {
      //解析用户数据,登录
      }
      
    • 加载getLocalData.html用于使用LocalStorage

      cordovaWebView.loadUrl("file:///android_asset/www/getLocalData.html");
      
    • 获取用户信息

      页面加载时,使用window.localStorage.getItem()方法获取所需数据,最后调用WebView暴露的原生onGetLocalData(String)方法将获取到的数据返回给原生代码。

      <!DOCTYPE html>
      <html>
      <head lang="en">
        <meta charset="UTF-8">
        <script>
        var _LAST_USER_ = '_LAST_USER_';
      
        var getUserInfo = function () {
            var username = window.localStorage.getItem(_LAST_USER_);
            if (username != null) {
                username = username.substring(1, username.length - 1);
            }
      
            var _PASSWORD_ = '_PASSWORD_' + username + '_';
            var password = window.localStorage.getItem(_PASSWORD_);
            if (password != null) {
                password = password.substring(1, password.length - 1);
            }
      
            var _ACCOUNT_ = '_ACCOUNT_' + username + '_';
            var account = window.localStorage.getItem(_ACCOUNT_);
      
            var localData = {};
            if (account != null) {
                account = JSON.parse(account);
      
                localData.uid = account.uid;
                localData.username = account.username;
                localData.password = password;
                localData.enableAutoLogin = account.enableAutoLogin;
                localData.loginId = account.loginId;
                localData.setting = account.setting;
            }
      
            window.cordovaWebView.onGetLocalData(JSON.stringify(localData));
        }
        </script>
      </head>
      <body onload="getUserInfo()">
      </body>
      </html>