Как очистить WKBackForwardList от WKWebView?

Похоже, что backForwardList из WKWebView является только для чтения, но я видел людей такими довольно волшебными вещами, чтобы обойти это. Мне нужно выяснить какой-то способ очистки истории WKWebView. Любые идеи, как я могу это сделать? Пока я пробовал несколько трюков, которые потерпели неудачу:

  • используя keyValue: forKey не работает.
  • используя указатель C -> не работает.

Я видел, как люди говорят о синтезе свойства и расширении класса, но я действительно не знаю, как это работает и не может понять. Любые другие идеи?

Этот код компилируется, но я его не тестировал …

Сначала я подклассифицирую WKWebView для переопределения backForwardList с моим собственным подклассом WKBackForwardList .

Затем, в моем подклассе WKBackForwardList , я могу либо переопределить backItem & forwardItem чтобы они возвращали forwardItem заставляли их заглядывать в свой список (что, скорее всего, является реализацией по умолчанию).

Или я могу переопределить backList & forwardList же, как в WKWebView с backForwardList . Я делаю это, чтобы добавить сеттер, который позволит мне удалить элементы из списков.

 import Foundation import WebKit class WebViewHistory: WKBackForwardList { /* Solution 1: return nil, discarding what is in backList & forwardList */ override var backItem: WKBackForwardListItem? { return nil } override var forwardItem: WKBackForwardListItem? { return nil } /* Solution 2: override backList and forwardList to add a setter */ var myBackList = [WKBackForwardListItem]() override var backList: [WKBackForwardListItem] { get { return myBackList } set(list) { myBackList = list } } func clearBackList() { backList.removeAll() } } class WebView: WKWebView { var history: WebViewHistory override var backForwardList: WebViewHistory { return history } init(frame: CGRect, configuration: WKWebViewConfiguration, history: WebViewHistory) { self.history = history super.init(frame: frame, configuration: configuration) } /* Not sure about the best way to handle this part, it was just required for the code to compile... */ required init?(coder: NSCoder) { if let history = coder.decodeObject(forKey: "history") as? WebViewHistory { self.history = history } else { history = WebViewHistory() } super.init(coder: coder) } override func encode(with aCoder: NSCoder) { super.encode(with: aCoder) aCoder.encode(history, forKey: "history") } } 

Слово на iOS8 ~ iOS11.

Objective-C

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [wek.backForwardList performSelector:NSSelectorFromString(@"_removeAllItems")]; #pragma clang diagnostic pop 

Swift 4

 webView.backForwardList.perform(Selector(("_removeAllItems"))) 

!!!!ЗАМЕТКА!!!! ЭТОТ МЕТОД ЗАЯВЛЯЕТСЯ В WebKit Open Resource, а не публичный метод.

  • wkwebview требуетсяUserActionForMediaPlayback не работает
  • Ускорьте загрузку WKWebView
  • Есть ли переопределение для изменения размера текста в реальном времени с использованием WKWebView для загрузки локальных файлов HTML?
  • Поддерживает ли webKit в iOS 11 (бета) поддержку WebRTC?
  • WKWebView пустой после «успешного» HTTPS NSURLRequest
  • Разрешить непроверенные сертификаты ssl в WKWebView
  • Как проверить, заканчивается ли загрузка WkWebView в Objective-C?
  • Сбой: WebThread - EXC_BAD_ACCESS KERN_INVALID_ADDRESS
  • com.apple.WebKit.WebContent drop 113 error: Не удалось найти указанную службу
  • WKWebview, вводящий cookie-заголовок, вызывает цикл перенаправления
  • Использование пользовательских шрифтов в WKWebView
  • Interesting Posts
    Давайте будем гением компьютера.