2017-10-20 70 views
0

我正在开发浏览器应用程序。我想在应用程序重新启动时恢复WKWebView对象。所以我序列化了WKWebView对象并保存到Realm中。但是当我反序列化WKWebView对象时,url和backList的数据从WKWebView中丢失了。为什么会从反序列化的WKWebView中删除url

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的唯一功能。

任何建议请。

回答

3

我老实说从来没有见过任何人编码查看像这样。一般来说,视图与NSCoding的一致性是为Interface Builder使用的,任何可以设置的属性都可能暴露在那里。

寻找在界面生成器,序列化的属性是导航手势,用户代理,链接预览和一堆属性WKWebViewConfiguration。我已经在断点确认这是它编码的全部内容。

backList表示在给定时间的视图状态,并且它被编码,将在WKWebView.encodeRestorableState(with:)中用于UIKit的状态恢复过程。不幸的是,这种方法没有实现,也没有保存状态。在this answer中,如果要在Web视图中重建历史记录,matt建议使用UIWebView。

另一个更复杂的方法是iOS的FireFox所做的。他们通过使用自定义Web请求服务器和通过JavaScript的history.pushState将URL注入历史记录的网页的技巧成功恢复WKWebView中的历史记录。代码的相关位是:

这种方法可能适用于浏览器领域的主要参与者之一,但对于大多数应用程序来说这可能并不值得。我个人建议只需坚持使用UIWebView和状态恢复,如暗淡建议。

相关问题