Ionic iOS(Capacitor、WKWebView)环境下如何发送Cookie?
兄弟我太懂你这种抓狂的感觉了!明明在Web和Android上顺得不行,到了iOS的WKWebView这里,Cookie就像凭空蒸发了一样,直接把认证流程干崩,真的离谱。我之前踩过一模一样的坑,给你整理几个亲测有效的解决办法,你挨个试试:
先把Capacitor的配置拉满
打开你的capacitor.config.ts,这是Capacitor管Cookie最核心的地方,一定要把域名配置对:import { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { appId: 'com.yourapp.id', appName: 'YourApp', webDir: 'www', bundledWebRuntime: false, server: { allowNavigation: ['your-api-domain.com'], // 替换成你的后端真实域名 cookieDomain: 'your-api-domain.com' // 必须和后端设置Cookie的域名完全匹配,别加http/https! } }; export default config;重点提醒:
cookieDomain绝对不能写错,多一个斜杠、少个后缀都不行,必须和后端Set-Cookie里的域名完全一致。前后端的Cookie策略要对齐
WKWebView对跨域Cookie的限制特别严,前后端必须配成一对儿:- 后端设置Cookie的时候,一定要加
SameSite=None; Secure(如果是本地测试用HTTP的话,Secure可以暂时去掉,但上线必须加,而且要配HTTPS),同时响应头里必须有Access-Control-Allow-Credentials: true; - 前端发请求的时候,必须带上
withCredentials: true,比如用Axios的话:axios.get('https://your-api-domain.com/check-auth', { withCredentials: true });
这俩参数缺一个,WKWebView都不会帮你带Cookie,别问我怎么知道的,都是泪。
- 后端设置Cookie的时候,一定要加
清掉模拟器的“历史遗留垃圾”
有时候模拟器里的旧Cookie、缓存会搞玄学问题,直接暴力清掉试试:- 删掉模拟器里的App,重新编译安装;
- 打开Xcode,选
Product -> Clean Build Folder,清完再跑; - 也可以用Capacitor的API直接清缓存:
import { Browser } from '@capacitor/browser'; async function clearOldCache() { await Browser.clearCache(); }
ATS设置别拖后腿
如果你的后端用的是HTTP(仅限测试,上线必须HTTPS),iOS的ATS会拦着你,得在Info.plist里加例外:
打开Xcode里的Info.plist,添加这段配置:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>your-api-domain.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>注意,上线前记得把这个临时例外去掉,换成HTTPS,不然App Store可能给你打回来。
另外还有个小坑:如果用localhost或者127.0.0.1在模拟器测试,WKWebView的Cookie规则会不一样,建议用工具把本地服务转成HTTPS域名测,这样更贴近真实环境。
我当时就是靠这几步把问题解决的,你先从Capacitor配置和请求设置开始查,这俩是最容易翻车的地方。
备注:内容来源于stack exchange,提问作者php_nub_qq

