iOS端flutter_inappwebview与webview_flutter无法传递headers问题求助
iOS端Flutter WebView丢失自定义请求头问题解决方案
问题根因
iOS系统的WKWebView存在原生机制限制:自定义请求头仅会在首次主文档请求时携带,当页面出现301/302重定向、或页面内部发起跨域请求时,系统会自动丢弃Authorization这类敏感自定义头,Android端WebView无此限制因此运行正常,和你配置的ATS、embedded_views_preview参数无关。
针对 flutter_inappwebview 5.3.2 的修复方案
通过重定向拦截回调,每次跳转时手动重新携带请求头,避免丢失:
body: InAppWebView( initialUrlRequest: URLRequest( url: Uri.parse(url), headers: {'Authorization': 'Bearer ' + token}, ), // 拦截服务器重定向请求,重写header后重新加载 onReceivedServerRedirectForProvisionalNavigation: (controller, navigationAction) async { final redirectUrl = navigationAction.request.url; if (redirectUrl == null) { return NavigationActionPolicy.ALLOW; } // 取消原有跳转,手动加载新地址并携带header await controller.loadUrl( urlRequest: URLRequest( url: redirectUrl, headers: {'Authorization': 'Bearer ' + token}, ) ); return NavigationActionPolicy.CANCEL; }, ),
针对 webview_flutter 2.3.1 的修复方案
该版本的loadUrl方法在iOS端存在已知的header传递缺陷,优先推荐两种处理方式:
- 升级webview_flutter到3.0及以上版本,使用
loadRequest方法发起请求:
body: WebView( javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (c) { c.loadRequest( Uri.parse(url), headers: {'Authorization': 'Bearer ' + token}, ); }, ),
- 若不方便升级版本,可将WebViewController实例存储为State类的成员变量,添加导航拦截回调手动补全header:
body: WebView( javascriptMode: JavascriptMode.unrestricted, navigationDelegate: (NavigationRequest request) { if (request.url != url) { // 拦截所有非首次请求,重新加载并携带header webViewController.loadUrl(request.url, headers: {'Authorization': 'Bearer ' + token}); return NavigationDecision.prevent; } return NavigationDecision.navigate; }, onWebViewCreated: (c) { webViewController = c; c.loadUrl( url, headers: {'Authorization': 'Bearer ' + token}, ); }, ),
内容的提问来源于stack exchange,提问作者jitendra purohit
相关产品推荐
相关产品推荐

