2017-10-20 69 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和狀態恢復,如暗淡建議。

相關問題