cordova-ios 6.x.x如何添加多主机名支持?
首先得明确:Cordova的<preference name="hostname">配置只支持单个值,你同时设置两个的话,第二个会直接覆盖第一个,这就是导致其中一个域名请求无法携带SESSION Cookie的核心原因。再加上WKWebView本身的同源策略和Cookie存储机制,即使开了$httpProvider.defaults.withCredentials = true,也会因为域名匹配失效而无法正常传递Cookie。
下面是几个可行的解决方案,你可以根据实际场景选择:
方案1:调整后端Cookie的Domain配置(推荐,从根源解决)
让后端服务根据请求的来源动态设置Cookie的Domain属性:
- 当请求来自
localhost时,将Cookie的Domain设为localhost - 当请求来自
xxx.com时,将Domain设为.xxx.com(注意前面的点,这样所有子域名也能匹配)
这样不管是本地调试还是线上环境,WKWebView都能正确匹配到对应的Cookie,自然会在请求头中携带。同时要确保后端配置了:
Access-Control-Allow-Credentials: trueAccess-Control-Allow-Origin设为请求的具体来源(不能是*)
方案2:使用Cordova插件同步WKWebView Cookie
如果后端调整成本较高,可以借助Cordova的插件来解决Cookie同步问题:
- 先移除重复的
<preference name="hostname">配置,只保留一个常用的(比如localhost或者xxx.com) - 添加WKWebView的跨域支持配置:
<preference name="iosAllowUniversalAccessFromFileURLs" value="true" /> - 安装Cookie同步插件:
cordova plugin add cordova-plugin-wkwebview-cookie-sync - 在应用的
deviceready事件中初始化同步:document.addEventListener('deviceready', function() { WKWebViewCookieSync.sync(function() { console.log('Cookie同步完成'); }); }, false);
这个插件会帮你统一管理WKWebView的Cookie存储,确保多域名请求时能正确携带Cookie。
方案3:前端手动携带Cookie(应急方案)
如果上面的方案都暂时无法实施,可以尝试手动在请求头中添加Cookie:
- 先从
document.cookie中提取SESSION Cookie的值:function getSessionCookie() { const cookies = document.cookie.split(';'); for (let cookie of cookies) { const [name, value] = cookie.trim().split('='); if (name === 'SESSION') { return value; } } return ''; } - 在Angular的
$http请求中手动添加Cookie头:$http({ method: 'GET', url: 'your-api-url', headers: { 'Cookie': `SESSION=${getSessionCookie()}` }, withCredentials: true });
这种方式需要维护Cookie的更新逻辑,适合临时应急使用。
最后再检查一遍:确保你的API服务器的CORS配置完全符合要求,withCredentials=true必须和具体的Access-Control-Allow-Origin配合使用,不能用通配符。
内容的提问来源于stack exchange,提问作者Manoj Shrestha
相关产品推荐
相关产品推荐

