我想创建一个应用,允许用户使用不同的网页浏览登录多个帐户。
例如,我有2个WebView
每个WebView都会加载相同的网站,例如gmail.com
用户可以在单独的WebView中使用单独的帐户登录。
但我面临的问题是2 WebView 始终登录到同一帐户。
我搜索了很多,这里有一些相关的标题,
Facebook MultiLogin in Android Webview
Using WebView for multi-page login to website and fetch data
Multiple Log-Ins on Separate WebViews? (Android)
但仍未找到可接受的答案。
在Android中使用WebView是否可行? 我怎样才能实现我的目标?
答案 0 :(得分:5)
棘手的部分是android.webkit.CookieManager,由WebView用于保存cookie,被设计为单身。这意味着每个Java / Dalvik进程只有一个CookieManager实例,同一进程内的多个WebView实例共享一组Cookie。
像@ToYonos提议的那样,你可以尝试覆盖某些钩子来解决这个问题,但我认为它不会100%有效......还要考虑android.webkit.WebStorage:它是另一个单!
也就是说,这可能会更可靠地处理位:在清单中复制顶级WebView活动并将其分配给在不同进程中运行:
<activity
android:name=".WebViewActivity" />
<activity
android:name=".WebView1Activity"
android:process=":web1" />
<activity
android:name=".WebView2Activity"
android:process=":web2" />
...
这样您就可以拥有独立的进程和不同的CookieManager / WebStorage实例。
但要注意:不同的WebStorage实例仍会写入app数据文件夹中的相同路径!这可以通过调用webView.getSettings().setDatabasePath()为不同的进程使用不同的数据库路径来解决,但是这个API在API级别19(KitKat)中已被弃用。只要您访问的网页没有使用HTML5本地存储,这应该没问题......
答案 1 :(得分:4)
我认为您必须实施自己的系统。你可以试试这样的东西:
private static final String DOMAIN = "http://cookiedomain.com";
private final Map<WebView, String> cookiesMap = new HashMap<WebView, String>();
// [...]
WebView w = new WebView(this);
// Loading url and stuff
w.setWebViewClient(new WebViewClient()
{
public void onLoadResource (WebView view, String url)
{
// If cookies have already been stored for this WebView
if (cookiesMap.get(view) != null)
{
CookieManager.getInstance().removeAllCookie();
CookieManager.getInstance().setCookie(DOMAIN, cookiesMap.get(view));
}
}
public void onPageFinished(WebView view, String url)
{
// Check if the url matches the after-login page or whatever you want
boolean condition = ...;
if(condition)
{
// Getting new cookies
String cookies = CookieManager.getInstance().getCookie(DOMAIN);
cookiesMap.put(view, cookies);
}
}
});
// Do the same for the 2nd WebView
这是一个简单的例子,需要改进,但它可能是一个可持续解决方案的良好开端。
限制: