[Flutter] Dio 与 InAppWebView 同步 Cookie

127 阅读1分钟

当我们使用 Dio 模拟某个网站登录后,有时需要用 InAppWebView 打开网页,或使用 InAppWebView 打开刚刚登录后,然后用 Dio 去请求网站 Api,这时就需要 Dio 与 InAppWebView 同步 Cookie


  // 从 Dio 的 CookieJar 获取 Cookie 并设置到 InAppWebView 中
  static Future<void> dioSyncCookie2InApp(String url) async {
    final inAppCookieManager = CookieManager.instance();
    CookieJar cookieJar = Http.cookieManager!.cookieJar; 
    List<Cookie> dioCookies = await cookieJar.loadForRequest(Uri.parse(url)); 
    for (var cookie in dioCookies) {
      // final expiresDate = DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;
      await inAppCookieManager.setCookie(
        url: WebUri(url),
        name: cookie.name,
        value: cookie.value,
        domain: cookie.domain,
        // path: cookie.path!,
        path: '/',
        // expiresDate: expiresDate,
        expiresDate: cookie.expires != null ? cookie.expires!.millisecondsSinceEpoch : null,
        isSecure: cookie.secure,
        isHttpOnly: cookie.httpOnly,
      );
    }
  }

  static Future inAppSyncCookie2Dio(List cookiesList, String url) async {
    // 接收 flutter_inappwebview Cookie List
    List<Cookie> jarCookies = [];
    if (cookiesList.isNotEmpty) {
      for (var i in cookiesList) {
        Cookie jarCookie = Cookie(i.name, i.value);
        jarCookies.add(jarCookie);
      }
    }
    var cookieString = jarCookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; ');
    await Http.cookieManager!.cookieJar.saveFromResponse(Uri.parse(url), jarCookies);
    Http.dio.options.headers['cookie'] = cookieString; 
  }