diff --git a/android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java b/android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java index 71e90444..0aeb8d02 100644 --- a/android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java +++ b/android/src/main/java/com/flutter_webview_plugin/FlutterWebviewPlugin.java @@ -94,12 +94,21 @@ public void onMethodCall(MethodCall call, MethodChannel.Result result) { case "cleanCache": cleanCache(result); break; + case "getAllCookies": + getAllCookies(call, result); + break; default: result.notImplemented(); break; } } + private void getAllCookies(MethodCall call, final MethodChannel.Result result){ + if (webViewManager != null){ + webViewManager.getAllCookies(call,result); + } + } + private void cleanCache(MethodChannel.Result result) { webViewManager.cleanCache(); WebStorage.getInstance().deleteAllData(); diff --git a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java index e19b2a08..262b7650 100644 --- a/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java +++ b/android/src/main/java/com/flutter_webview_plugin/WebviewManager.java @@ -347,6 +347,13 @@ public void onReceiveValue(Boolean aBoolean) { } } + void getAllCookies(MethodCall call, final MethodChannel.Result result){ + String url = call.argument("url"); + CookieManager cookieManager = CookieManager.getInstance(); + String cookieStr = cookieManager.getCookie(url); + result.success(cookieStr); + } + private void clearCache() { webView.clearCache(true); webView.clearFormData(); diff --git a/ios/Classes/FlutterWebviewPlugin.m b/ios/Classes/FlutterWebviewPlugin.m index fc266094..3b64e3ba 100644 --- a/ios/Classes/FlutterWebviewPlugin.m +++ b/ios/Classes/FlutterWebviewPlugin.m @@ -79,6 +79,10 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { [self onCanGoForward:call result:result]; } else if ([@"cleanCache" isEqualToString:call.method]) { [self cleanCache:result]; + } else if ([@"getAllCookies" isEqualToString:call.method]) { + [self getAllCookies:call completionHandler:^(NSString *cookies) { + result(cookies); + }]; } else { result(FlutterMethodNotImplemented); } @@ -303,6 +307,26 @@ - (void)cleanCookies:(FlutterResult)result { } } +- (void)getAllCookies:(FlutterMethodCall*)call + completionHandler:(void (^_Nullable)(NSString * cookies))completionHandler { + if (self.webview != nil) { + NSString *url = call.arguments[@"url"]; + WKHTTPCookieStore *cookieStore = self.webview.configuration.websiteDataStore.httpCookieStore; + [cookieStore getAllCookies:^(NSArray * _Nonnull cookies) { + NSString *allCookies = @""; + NSEnumerator *cookie_enum = [cookies objectEnumerator]; + NSHTTPCookie *temp_cookie; + while (temp_cookie = [cookie_enum nextObject]) { + NSString *temp = [NSString stringWithFormat:@"%@=%@;",[temp_cookie name],[temp_cookie value]]; + allCookies = [allCookies stringByAppendingString:temp]; + } + completionHandler([NSString stringWithFormat:@"%@", allCookies]); + }]; + } else { + completionHandler(nil); + } +} + - (void)cleanCache:(FlutterResult)result { if (self.webview != nil) { if (@available(iOS 9.0, *)) { diff --git a/lib/src/base.dart b/lib/src/base.dart index 05de5db8..a88f9a7a 100644 --- a/lib/src/base.dart +++ b/lib/src/base.dart @@ -295,6 +295,24 @@ class FlutterWebviewPlugin { _instance = null; } + // get all cookies including HttpOnly + // but for ios, it only support ios 11 or above + Future> getAllCookies(String url) async { + final cookiesString = await _channel.invokeMethod('getAllCookies', {'url': url}); + final cookies = {}; + + if (cookiesString?.isNotEmpty == true) { + cookiesString.split(';').forEach((String cookie) { + if (cookie.isNotEmpty && cookie.contains('=')) { + final split = cookie.split('='); + cookies[split[0].trim()] = split[1].trim(); + } + }); + } + + return cookies; + } + Future> getCookies() async { final cookiesString = await evalJavascript('document.cookie'); final cookies = {};