插件介绍

webview_cookie_manager 是一个用于管理 WebView cookies 的 Flutter 插件,支持在鸿蒙平台上使用。该插件使用 iOS 的 httpCookieStore 和 Android 的 CookieManager 来存储和检索 cookies。

该插件适用于需要管理 WebView cookies 的应用场景,如登录状态保持、用户偏好设置等。

安装与使用

安装方式

在引用的项目中,pubspec.yamldependencies 新增配置:

dependencies:
  webview_cookie_manager:
    git:
      url: "https://atomgit.com/openharmony-sig/fluttertpc_webview_cookie_manager.git"
      path: "."

执行命令安装依赖:

flutter pub get

基本使用示例

以下是一个简单的使用示例,展示如何在鸿蒙平台上使用 webview_cookie_manager 插件管理 WebView cookies:

import 'dart:io';

import 'package:flutter/material.dart';

import 'package:webview_cookie_manager/webview_cookie_manager.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const WebViewPage(),
    );
  }
}

class WebViewPage extends StatefulWidget {
  const WebViewPage({Key? key}) : super(key: key);

  _WebViewPageState createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  final cookieManager = WebviewCookieManager();
  WebViewController controller = WebViewController();

  final String _url = 'https://www.nvidia.cn';
  final String cookieValue = 'some-cookie-value';
  final String domain = 'm.youtube.com';
  final String cookieName = 'some_cookie_name';

  
  void initState() {
    super.initState();
    cookieManager.clearCookies();
    controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..loadRequest(Uri.parse(_url))
      ..setNavigationDelegate(NavigationDelegate(
        onPageFinished: (_) async {
          final gotCookies = await cookieManager.getCookies(_url);
          for (var item in gotCookies) {
            print(item);
          }
        },
      ));
    cookieManager.setCookies([
      Cookie(cookieName, cookieValue)
        ..domain = domain
        ..expires = DateTime.now().add(Duration(days: 10))
        ..httpOnly = false
    ]);
  }

  void setCookiesFunc() {
    Cookie cookie = Cookie(cookieName, cookieValue)
      ..domain = 'www.nvidia.cn'
      ..expires = DateTime.now().add(Duration(days: 10))
      ..secure = false
      ..httpOnly = false;

    cookieManager.setCookies([cookie], origin: 'https://www.nvidia.cn');
  }

  void clearCookies() {
    cookieManager.clearCookies();
    // 出现弹窗提示 清理cookies成功
    _showInfoDialog('提示', "Cookies清理成功");
  }

  void hasCookie() async {
    bool cookiesExist = await cookieManager.hasCookies();
    String content = cookiesExist ? '存在cookie' : '不存在cookie';
    _showInfoDialog('提示', content);
  }

  // 弹窗提示
  void _showInfoDialog(String title, String content) {
    showDialog(
      context: context,
      builder: (BuildContext context) => AlertDialog(
        title: Text(title),
        content: Text(content),
        actions: [
          TextButton(
            child: const Text('确定'),
            onPressed: () => Navigator.of(context).pop(context),
          )
        ],
      ),
    );
  }

  void removeCookie() {
    cookieManager.removeCookie(_url);
  }

  void showCookieListDialog(BuildContext context, List<Cookie> cookies) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('Cookies'),
          content: SizedBox(
            width: double.maxFinite,
            height: 400,
            child: ListView.builder(
              itemCount: cookies.length,
              itemBuilder: (context, index) {
                final cookie = cookies[index];
                return ListTile(
                  leading: const Icon(Icons.cookie),
                  title: Text(cookie.name),
                  subtitle: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text("值: ${cookie.value}"),
                      Text("域: ${cookie.domain ?? '无'}"),
                      Text(
                          "过期: ${cookie.expires?.toLocal().toString() ?? 'Session'}"),
                      Text(
                          "HttpOnly: ${cookie.httpOnly}, Secure: ${cookie.secure}"),
                    ],
                  ),
                  isThreeLine: true,
                );
              },
            ),
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: const Text("关闭"),
            ),
          ],
        );
      },
    );
  }

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
          actions: [
            IconButton(
              icon: Icon(Icons.ac_unit),
              onPressed: () async {
                final cookieList = await cookieManager.getCookies(_url);
                showCookieListDialog(context, cookieList);
              },
            ),
            IconButton(icon: Icon(Icons.add), onPressed: setCookiesFunc),
            IconButton(icon: Icon(Icons.delete), onPressed: clearCookies),
            IconButton(icon: Icon(Icons.device_unknown), onPressed: hasCookie),
            IconButton(icon: Icon(Icons.beach_access), onPressed: removeCookie)
          ],
        ),
        body: WebViewWidget(controller: controller),
      ),
    );
  }
}

核心 API 说明

API 名称 描述 返回值
getCookies 获取指定 URL 的 cookies Future<List<Cookie>>
setCookies 设置 cookies Future<void>
hasCookies 检查是否有任何 cookies Future<bool>
removeCookie 删除指定 URL 的 cookies Future<void>
clearCookies 清除所有 cookies Future<void>

约束与限制

兼容性

该插件支持以下平台:

  • Android (API level 9+)
  • iOS (11+)
  • 鸿蒙平台

注意事项

  1. Domain 属性:根据 RFC,Domain 属性不是必需的,但空域会导致未定义的行为。因此,强烈建议指定 Domain 属性。

  2. Secure 属性:如果看到错误 Strict Secure Cookie policy does not allow setting a secure cookie for http://your-domain.net/ for apps targeting >= R.,则需要在设置 cookie 时指定 origin,此时不需要设置 domain。

总结

webview_cookie_manager 插件提供了一种简单高效的方式来管理 WebView cookies,适用于各种需要管理 cookies 的应用场景。该插件具有以下优点:

  1. 简单易用:提供了简洁的 API,只需调用相应的方法即可管理 cookies。
  2. 跨平台支持:支持在 Android、iOS 和鸿蒙平台上使用。
  3. 功能丰富:支持获取、设置、删除和清除 cookies 等操作。
  4. 性能优异:直接调用系统底层 API,管理 cookies 的效率高。

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐