flutter_webview_plugin设置cookie
前言
原版的flutter_webview_plugin(v0.3.0+2版本)是不支持设置cookie的。所以接下来我们就需要修改源代码来支持设置cookie。先去GitHub上把这个插件下载下来:
flutter_webview_plugin github 链接
使用
flutter_webview_plugin支持cookie版下载
1、把该插件导入工程
2、在pubspec.yaml文件下添加依赖:
flutter_webview_plugin:
path: plugin/flutter_webview_plugin #webview
3、在使用的文件中import
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
4、使用示例
_build() {
return WebviewScaffold(
appBar: appBar: AppBar(
title: Text('网页'),
),
url: _urlString,
cookieList: [
{'k': 'app_user_auth', 'v': _auth},
],
withJavascript: true,
supportMultipleWindows: true,
withLocalStorage: true,
);
}
其中_urlString是网页链接,cookieList是你要设置的cookie键值对,传入的是一个List。k为cookie的key,v为key对应的值。
开始修改
1、给WebviewScaffold添加一个属性:cookieList用来传入需要设置的cookie。
List<Map<String,String>> cookieList;
2、修改iOS源文件,因为此插件里面使用的是wkwebview所以不能按照uiwebview那样设置cookie。我们得特殊设置一下:
NSArray *cookies = call.arguments[@"cookieList"];
_cookieList = cookies;
//应用于 ajax 请求的 cookie 设置
WKUserContentController *userContentController = WKUserContentController.new;
// 应用于 request 的 cookie 设置
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString: url]];
NSDictionary *headFields = request.allHTTPHeaderFields;
[cookies enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSDictionary *dic = obj;
NSString *cookieSource = [NSString stringWithFormat:@"document.cookie = '%@=%@;path=/';",dic[@"k"], dic[@"v"]];
WKUserScript *cookieScript = [[WKUserScript alloc] initWithSource:cookieSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
NSString *cookie = headFields[dic[@"k"]];
if (cookie == nil) {
[request addValue:[NSString stringWithFormat:@"%@=%@",dic[@"k"] , dic[@"v"]] forHTTPHeaderField:@"Cookie"];
}
}];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = userContentController;
self.webview = [[WKWebView alloc] initWithFrame:rc configuration:config];
self.webview.navigationDelegate = self;
self.webview.scrollView.delegate = self;
self.webview.hidden = [hidden boolValue];
self.webview.scrollView.showsHorizontalScrollIndicator = [scrollBar boolValue];
self.webview.scrollView.showsVerticalScrollIndicator = [scrollBar boolValue];
3、修改Android源文件,给Android的webview设置cookie我们必须要在settings之后loadUrl之前,否则设置无效。
```
//WebviewManager.java文件中添加以下方法
void setCookie(String url) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeAllCookie();
cookieManager.removeSessionCookie();//移除
Uri uri = Uri.parse(url);
String domain = uri.getHost();
for (int i = 0; i < this.mCookieList.size(); i++) {
Map<String, String> map = this.mCookieList.get(i);
cookieManager.setCookie(domain, map.get("k") + '=' + map.get("v"));
}
//cookies是在HttpClient中获得的cookie
cookieManager.flush();
}
```