美文网首页
flutter_webview_plugin设置cookie

flutter_webview_plugin设置cookie

作者: joeal | 来源:发表于2019-01-17 20:31 被阅读86次

    flutter_webview_plugin设置cookie

    前言

    原版的flutter_webview_plugin(v0.3.0+2版本)是不支持设置cookie的。所以接下来我们就需要修改源代码来支持设置cookie。先去GitHub上把这个插件下载下来:

    flutter_webview_plugin pub 链接

    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;
    
    flutter.png

    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];
    
    
    ios.png

    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();
    }
    ```
    
    android.png

    相关文章

      网友评论

          本文标题:flutter_webview_plugin设置cookie

          本文链接:https://www.haomeiwen.com/subject/ctjwdqtx.html