如何清除WKWebView的WKBackForwardList?

看起来backForwardList的backForwardList是只读的,但是我看到人们有一些非常神奇的东西来解决这个问题。 我需要找出一些清除WKWebView历史的方法。 任何想法我怎么可能这样? 到目前为止,我尝试了一些失败的技巧:

  • 使用keyValue:forKey不起作用。
  • 使用C指针->没有用。

我已经看到人们谈论合成属性和扩展课程,但我真的不知道它是如何工作的,无法弄明白。 还有其他想法吗?

这段代码编译,但我没有测试过…

首先,我将backForwardList子类WKWebView使用我自己的WKBackForwardList子类覆盖WKBackForwardList

然后,在我的WKBackForwardList子类中,我可以覆盖backItemforwardItem以使它们返回nil,而不是让它们查看它们各自的列表(这很可能是默认实现)。

或者我可以像在WKWebView使用backForwardList一样覆盖backListforwardList 。 我这样做是为了添加一个setter,这将允许我从列表中删除项目。

 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 

斯威夫特4

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

!!!!注意!!!! 这种方法在WebKit Open Resource中声明,而不是公共方法。

阅读文档,您可以获得WKWebView的WKBackForwardList。 之后你可以找到WKBackForwardList的backList中的第一个项目,然后使用: func go(to: WKBackForwardListItem) -> WKNavigation? 有了这个,你可以清理历史到第一个url。