Hybrid App里H5和原生怎么共享Cookie?
我们App用的是WebView加载H5页面,登录是原生做的,但H5页面需要读取登录态。现在问题是原生设置的Cookie,H5里通过document.cookie根本拿不到,试过在Android的WebView里用CookieManager设置,iOS也用WKHTTPCookieStore加了,但H5还是读不到,是不是哪里漏了?
比如Android这边代码是这样的:
CookieManager.getInstance().setCookie(url, "token=abc123; Path=/; Domain=.example.com");
CookieManager.getInstance().flush();
但H5控制台打印document.cookie一直是空的,这到底咋整?
先说最常见的情况:你写的是
Domain=.example.com,但H5页面实际访问的是https://m.example.com或者https://example.com/h5/xxx,那Cookie根本不会回传到H5里,因为浏览器(或者说WebView)会做严格的Domain匹配。你先确认几点:
第一,H5页面的域名必须和你设的Cookie的Domain兼容,比如你设了
.example.com,那H5得是example.com、www.example.com、m.example.com这种子域名才能收到;如果H5是app.example.com,但你没加app.example.com到Cookie里,那也拿不到。第二,Cookie的Path必须匹配URL路径,比如你设了
Path=/api,那H5访问/home就不会带上这个Cookie,改成Path=/就行。第三,也是最容易忽略的:Android WebView默认不支持第三方Cookie,iOS WKWebView也得手动开。你光调
setCookie是没用的,Android要加这句:iOS那边WKWebView要配
WKWebsiteDataStore.default(),别用nonPersistent的,而且得在加载页面前就把Cookie写进去,最好在webView(_:didFinish:)里再同步一次。还有一点,H5页面如果走的是file协议(比如
file:///android_asset/index.html),那根本没Domain,Cookie自然不生效,这种情况建议用本地服务器兜底,比如开个localhost:8080做H5的Host。最后提醒一句,调试的时候别只看
document.cookie,用浏览器开发者工具或者 Charles 抓包看请求头里有没有Cookie: token=abc123,有时候H5真没权限读,但请求是带上了的。主题里可以加个JS兜底方案,比如原生把token塞到
window.nativeToken里,H5先读这个,不行再 fallback 到Cookie,至少能跑起来,后面再慢慢调透。