【问题标题】:Xamarin Forms Delete Web Cache / Javascript StorageXamarin 表单删除 Web 缓存/Javascript 存储
【发布时间】:2019-06-25 03:36:21
【问题描述】:

我有一个使用 http 服务器将文件提供给 Web 视图的应用程序。 Web 查看器正在缓存图像链接,当它们的路径更改时会导致图像损坏。

我可以在 Android 和 UWP 上删除网上商店,但我不知道如何正确使用 iOS。

安卓:

Android.Webkit.WebStorage.Instance.DeleteAllData();

UWP:

Windows.UI.Xaml.Controls.WebView.ClearTemporaryWebDataAsync();

我尝试了以下方法,但没有成功:

 NSHttpCookieStorage.SharedStorage.RemoveCookiesSinceDate(NSDate.DistantPast);
            WKWebsiteDataStore.DefaultDataStore.FetchDataRecordsOfTypes(WKWebsiteDataStore.AllWebsiteDataTypes, (NSArray records) =>
            {
                for (nuint i = 0; i < records.Count; i++)
                {
                    var record = records.GetItem<WKWebsiteDataRecord>(i);

                    WKWebsiteDataStore.DefaultDataStore.RemoveDataOfTypes(
                    websiteDataTypes: record.DataTypes,
                    date: new[] { record },
                    completionHandler: ()=> { });
                }

                for (nuint i = 0; i < records.Count; i++)
                {
                    var record = records.GetItem<WKWebsiteDataRecord>(i);

                    WKWebsiteDataStore.DefaultDataStore.RemoveDataOfTypes(record.DataTypes,
                        new[] { record }, () => { Console.Write($"deleted: {record.DisplayName}"); });
                }
            });

            NSUrlCache.SharedCache.RemoveAllCachedResponses();   
            NSUrlCache.SharedCache.DiskCapacity = 0;
            NSUrlCache.SharedCache.MemoryCapacity = 0;

【问题讨论】:

  • 如果问题解决了,记得把它标记为已接受,然后这个问题就可以关闭了。^.^
  • 发布后 2 天才能标记为已回答。到时候我会标记的。谢谢。

标签: xamarin.forms webview xamarin.ios wkwebview


【解决方案1】:

https://gochannel.org/links/link/snapshot/640找到答案

重写为 Xamarin IOS

    private void DeleteCachedFiles()
    {

        if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0))
        {
            NSHttpCookieStorage.SharedStorage.RemoveCookiesSinceDate(NSDate.DistantPast);
            WKWebsiteDataStore.DefaultDataStore.FetchDataRecordsOfTypes(WKWebsiteDataStore.AllWebsiteDataTypes, (NSArray records) =>
            {
                for (nuint i = 0; i < records.Count; i++)
                {
                    var record = records.GetItem<WKWebsiteDataRecord>(i);

                    WKWebsiteDataStore.DefaultDataStore.RemoveDataOfTypes(record.DataTypes,
                        new[] { record }, () => { Console.Write($"deleted: {record.DisplayName}"); });
                }
            });

            NSUrlCache.SharedCache.RemoveAllCachedResponses();
        }
        else
        {

            // Remove the basic cache.
            NSUrlCache.SharedCache.RemoveAllCachedResponses();
            var cookies = NSHttpCookieStorage.SharedStorage.Cookies;

            foreach (var c in cookies)
            {
                NSHttpCookieStorage.SharedStorage.DeleteCookie(c);
            }
        }


        try
        {
            // Clear web cache
            DeleteLibraryFolderContents("Caches");

            // Remove all cookies stored by the site. This includes localStorage, sessionStorage, and WebSQL/IndexedDB.
            DeleteLibraryFolderContents("Cookies");

            // Removes all app cache storage.
            DeleteLibraryFolder("WebKit");

        }
        catch (Exception ex)
        {
            App.UnhandledException(ex, $"Error deleting cache {ex.Message}");
        }

    }

    private void DeleteLibraryFolder(string folderName)
    {
        var manager = NSFileManager.DefaultManager;
        var library = manager.GetUrls(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User).First();
        var dir = Path.Combine(library.Path, folderName);

        manager.Remove(dir, out NSError error);
        if (error != null)
        {
            App.UnhandledException(new Exception(error.Description), error.Description);
        }
    }

    private void DeleteLibraryFolderContents(string folderName)
    {
        var manager = NSFileManager.DefaultManager;
        var library = manager.GetUrls(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomain.User).First();
        var dir = Path.Combine(library.Path, folderName);
        var contents = manager.GetDirectoryContent(dir, out NSError error);
        if (error != null)
        {
            App.UnhandledException(new Exception(error.Description), error.Description);
        }

        foreach (var c in contents)
        {
            try
            {
                manager.Remove(Path.Combine(dir, c), out NSError errorRemove);
                if (errorRemove != null)
                {
                    App.UnhandledException(new Exception(error.Description), error.Description);
                }
            }
            catch (Exception ex)
            {
                App.UnhandledException(ex, $"Error deleting folder contents: {folderName}{Environment.NewLine}{ex.Message}");
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多