Cookie有效期设置需确保时间戳、Domain、Path、Secure四要素正确:PHP中过期时间必须为time()+秒数而非相对秒数;Domain应设为.example.com以跨子域共享;HTTP环境禁用Secure;iOS需手动同步OkHttp Cookie至WKWebView。

移动端 WebView 中 Cookie 有效期设置看似简单,实则容易因平台差异、协议约束和配置疏漏导致失效。核心问题不是“设没设”,而是“设对没对”——时间值、作用域、传输协议、存储同步这四点任一出错,Cookie 就可能不写入、不携带或提前过期。
过期时间传的是相对秒数,不是时间戳
这是 PHP 后端最常踩的坑:把 setcookie('token', 'abc', 3600) 当成“1小时后过期”。实际上第三个参数必须是 Unix 时间戳(如 time() + 3600),否则浏览器会当作 1970 年 1 月 1 日某个毫秒数来解析,结果 Cookie 立即失效或根本拒绝保存。
- ✅ 正确:
setcookie('user', 'john', time() + 3600, '/', 'example.com', true, true) - ❌ 错误:
setcookie('user', 'john', 3600, ...)或setcookie(..., '3600', ...) - ⚠️ 注意:服务器与手机本地时间偏差超过过期窗口(比如差 2 小时),也会让 Cookie 在客户端“还没开始就已过期”
Domain 和 Path 配置不匹配,跨页/跨域不生效
WebView 加载的是 H5 页面,但登录接口可能在 login.example.com,商品页在 shop.example.com。若后端 Set-Cookie 没带 Domain=.example.com,该 Cookie 只作用于登录子域,切页后请求不会自动带上。
- ✅ 建议后端统一设置
Domain=.example.com(注意开头的点)和Path=/ - ❌ 若只设
Domain=login.example.com,则shop.example.com无法读取 - ⚠️ Android
CookieManager.setCookie()和 iOSHTTPCookieStorage都严格遵循 Domain 规则,手动注入也无效
Secure 属性强制 HTTPS,但 WebView 用 HTTP 加载
如果后端设置了 Secure(即只允许 HTTPS 传输),而 App 内 WebView 是通过 http:// 协议加载页面(比如调试时用本地 HTML 或未启用 TLS 的测试环境),那么即使 Cookie 成功下发,WebView 也不会存储它。
- ✅ 开发阶段可临时关闭 Secure(仅限非生产环境);上线前务必确保 H5 全站走 HTTPS
- ❌ 不要指望“WebView 降级兼容”——现代 Android/iOS 对 Secure 的校验是硬性拦截
- ⚠️ 注意:某些混合框架(如 Cordova)默认用
file://协议加载,此时 Secure + HttpOnly Cookie 完全不可用
iOS WKWebView 不共享系统 Cookie 容器
Android WebView 默认使用系统 CookieSyncManager(已弃用但仍兼容),而 iOS 的 WKWebView 使用独立的内存 Cookie 存储,与 NSHTTPCookieStorage.shared 互不相通。OkHttp 登录拿到的 Cookie 若只存进 OkHttp 的 CookieJar,不会自动出现在 WKWebView 里。
- ✅ 必须手动将 OkHttp 获取的 Cookie 同步到
WKHTTPCookieStore(iOS 11+) - ✅ Android 侧也要调用
CookieManager.getInstance().setCookie(url, cookieStr)并触发CookieSyncManager.createInstance().sync()(API 21+ 改为CookieManager.flush()) - ⚠️ 同步时机很重要:必须在 WebView 加载目标页面前完成,且 URL 要与 Cookie 的 Domain/Path 匹配

















