我正在开发一款浏览器应用。我想在重新启动应用程序时恢复WKWebView对象。所以我序列化了WKWebView对象并保存到了Realm。但是当我反序列化WKWebView对象时,url和backList的数据从WKWebView中丢失。
let WebView = WKWebView()
WebView.frame = CGRect(x: 0, y: 0, width:300, height:650)
let urlString = "http://www.google.com"
let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed)
let url = NSURL(string: encodedUrlString!)
let request = NSURLRequest(url: url! as URL)
WebView.load(request as URLRequest)
let serialized_WebView = NSKeyedArchiver.archivedData(withRootObject: WebView) as NSData //convert to NSData
let deserialized_WebView = NSKeyedUnarchiver.unarchiveObject(with: serialized_WebView as! Data) as! WKWebView
print("frame",deserialized_WebView.frame) // frame (0.0, 0.0, 300.0, 650.0)
print("url",deserialized_WebView.url) // url nil
print("backList",deserialized_WebView.backForwardList.backList) // backList []
我不仅要恢复url,还要将backList恢复为WKWebView对象的一部分。如果可能的话,我不想实现保存backList的唯一功能。
请提出任何建议。
答案 0 :(得分:3)
我以前从未见过有人像这样编码视图。一般来说,视图与NSCoding的一致性旨在供Interface Builder使用,任何可以设置的属性都可能会在那里公开。
在Interface Builder中,序列化属性包括导航手势,用户代理,链接预览和WKWebViewConfiguration
的一系列属性。我已经在断点中证实这就是它的全部编码。
backList
代表给定时间的视图状态,如果编码它将在WKWebView.encodeRestorableState(with:)
中进行编码,以便在UIKit的状态恢复过程中使用。遗憾的是,此方法未实现且未保存任何状态。在this answer中,如果您想在Web视图中重建历史记录,则matt建议使用UIWebView。
另一种更复杂的方法是FireFox for iOS的功能。他们使用自定义Web请求服务器和通过JavaScript history.pushState
将URL注入历史记录的网页,成功地在WKWebView中恢复历史记录。相关的代码位是:
Tab.restore(_:WKWebView)
:他们的代码将一系列网址和手中的内容发送到本地网络服务器。这种方法可能适用于浏览器领域的主要参与者之一,但对于大多数应用来说,这可能不值得。我个人会建议坚持使用UIWebView和像matt建议的状态恢复。